Php Crypt函数为相同的密码生成相同的哈希
我正在尝试创建一个散列函数,给定一个随机salt,它将从中生成一个密码散列 问题是,如果我为两个不同的用户输入相同的密码,那么生成的哈希对这两个用户都是相同的 有什么问题吗Php Crypt函数为相同的密码生成相同的哈希,php,hash,password-protection,Php,Hash,Password Protection,我正在尝试创建一个散列函数,给定一个随机salt,它将从中生成一个密码散列 问题是,如果我为两个不同的用户输入相同的密码,那么生成的哈希对这两个用户都是相同的 有什么问题吗 public function generateSalt() { return $salt = substr(sha1(uniqid(rand(), true)), 0, 32); } public function pwdEncrypt($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()
将使用标准的基于Unix DES的算法返回哈希字符串
标准的基于DES的散列有一个两字符salt,来自字母表“/0-9A-Za-z”
因为在您的例子中,盐的前三个字符总是相同的,所以使用的盐总是相同的
使用
及
crypt()
将使用标准的基于Unix DES的算法返回哈希字符串
标准的基于DES的散列有一个两字符salt,来自字母表“/0-9A-Za-z”
因为在您的例子中,盐的前三个字符总是相同的,所以使用的盐总是相同的
使用
及
这不是你对河豚(
$2a$
)使用的crypt
)
您需要指定强度,以及最后的盐
试试这个crypt($password,$2a$08$'.$salt)代码>
明显增加了强度以提高安全性,但牺牲了处理时间
我还应该补充一点,如果您使用的PHP版本大于5.3.7,您应该为您的河豚算法使用$2y$
,因为2011年发现了对$2a$
的攻击。这不是您对河豚使用crypt
的方式($2a$
)
您需要指定强度,以及最后的盐
试试这个crypt($password,$2a$08$'.$salt)代码>
明显增加了强度以提高安全性,但牺牲了处理时间
我还应该补充一点,如果您使用的PHP版本大于5.3.7,您应该为您的blowfish算法使用$2y$
,因为2011年发现了对$2a$
的攻击。告诉我们如何调用pwdenscript()
。顺便说一下,正确的拼写是“Encrypt”@ThiefMaster谢谢你的通知。我用你询问的信息编辑了这篇文章确保你确实通过了$password和$salt,可能没有为这些变量传递值,你得到的只是crypt()
的$2a$
和$
@Austin,我已经测试过了。不同的密码产生不同的哈希。否则,所有的哈希值都是相同的。演示如何调用pwdenscript()
。顺便说一下,正确的拼写是“Encrypt”@ThiefMaster谢谢你的通知。我用你询问的信息编辑了这篇文章确保你确实通过了$password和$salt,可能没有为这些变量传递值,你得到的只是crypt()
的$2a$
和$
@Austin,我已经测试过了。不同的密码产生不同的哈希。如果你的系统有CRYPT\u BLOWFISH
可用,而这正是你想要做的,那么Leigh的答案是正确的。我正想问这个问题!谢谢你的努力!这仍然是一个很好的有效答案;)如果你的系统有可用的CRYPT\u河豚,而这正是你想要做的,那么Leigh的答案是正确的。我正要问这个问题!谢谢你的努力!这仍然是一个很好的有效答案;)@乔迪亚斯:请看我的编辑。对于算法的选择,这里有一些指导。但是,我知道,2y$似乎不起作用。。。我正在LocalHost上运行PHP5.3.5您的PHP版本可能太低了(如果它太低,您真的应该升级)有什么方法可以基于PHP版本进行加密吗?@JoãoDias:您可以使用version\u compare(PHP_version,'5.3.7')>=0
来检查版本。@JoãoDias:请查看我的编辑。对于算法的选择,这里有一些指导。但是,我知道,2y$似乎不起作用。。。我正在LocalHost上运行PHP5.3.5您的PHP版本可能太低了(如果它太低,您真的应该升级)有什么方法可以基于PHP版本进行加密吗?@JoãoDias:您可以使用version\u compare(PHP\u version,'5.3.7')>=0
来检查版本。
return $salt = substr(sha1(uniqid(rand(), true)), 0, 2);
$hash = crypt($password, $salt);