我正在尝试创建一个哈希函数,该函数在给定随机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);