Crypt函数为相同的密码生成相同的哈希


Crypt function generetes the same hash for the same password

我正在尝试创建一个哈希函数,该函数在给定随机salt的情况下,从中生成一个密码哈希。

问题是,如果我为两个不同的用户输入相同的密码,那么生成的哈希对两个用户都是相同的。

问题出在哪里?

public function generateSalt()
{       

     return $salt = substr(sha1(uniqid(rand(), true)), 0, 32);
}
public function pwdEncrypt($password, $salt)
{       
    $hash = crypt($password, '$2a$' . $salt . '$');     
    return $hash;
}
public function registerUser($nome, $email, $password, $permitions, $active)
{

    $this->nome = $nome;
    $this->email = $email;

    $salt = $this->generateSalt();

    $this->password = $this->pwdEncrypt($password, $salt);
   //INSERT METHODS BELOW
}

这不是将crypt与河豚($2a$)一起使用的方式

您需要指定强度,并在末尾指定盐。

尝试此crypt($password, '$2a$08$'.$salt);

显然,以牺牲处理时间为代价来提高强度以提高安全性。

我还应该补充一点,如果你使用的PHP版本大于5.3.7,你应该使用$2y$作为你的河豚算法,因为2011年发现了对$2a$的攻击。

crypt()将使用标准的基于Unix DES的算法返回一个散列字符串。

基于DES的标准散列具有字母表"./0-9A-Za-z"中的两个字符的salt

由于在您的情况下,盐的前三个字符总是相同的,因此所用的盐总是相同的。

使用

return $salt = substr(sha1(uniqid(rand(), true)), 0, 2);

$hash = crypt($password, $salt);