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

时间:2012-07-27 13:38:58

标签: php hash password-protection

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

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

Waht可能是问题?

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
}

2 个答案:

答案 0 :(得分:3)

这不是你如何使用crypt与河豚($2a$

你需要指定力量和最后的盐。

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

显然增加了强度以提高安全性,但却牺牲了处理时间。

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

答案 1 :(得分:2)

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

标准的基于DES的哈希在字母“./0-9A-Za-z”中有两个字符盐

因为在你的情况下,盐的第一个三个字符总是相同的,所以使用的盐总是相同的。

使用

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

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