0

我正在尝试创建一个散列函数,给定随机盐,从中生成密码散列。

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

可能是什么问题?

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
}
4

2 回答 2

3

这不是你使用crypt河豚的方式($2a$

您需要指定强度和最后的盐。

试试这个crypt($password, '$2a$08$'.$salt);

显然增加强度以提高安全性,但代价是处理时间。

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

于 2012-07-27T13:45:08.297 回答
2

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

基于标准 DES 的散列具有来自字母表“./0-9A-Za-z”的两个字符的盐。

由于在您的情况下盐的前三个字符始终相同,因此使用的盐始终相同。

采用

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

$hash = crypt($password, $salt);   
于 2012-07-27T13:44:01.613 回答