我在旧应用程序中使用了MD5()
密码哈希,我想切换到crypt()
哈希,因为它更安全。但是......我对crypt()
函数没有任何体验。
所以现在哈希我有这个:
function hashPassword($uPassword) {
$processingPower = 10;
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');
$salt = sprintf("$2a$%02d$", $processingPower) . $salt;
$hash = crypt($password, $salt);
return $hash;
}
为了比较密码,我有这个:
if (crypt($uPassword, $uData['uPassword']) == $uData['uPassword'])
似乎一切正常,但我仍然可以使用存储在我的dB中的旧(MD5)密码登录。 这是正常行为还是我的代码中出现了问题?
答案 0 :(得分:1)
MD5密码以$1$
开头。 crypt()
可以通过这种方式识别MD5哈希并正确识别它们(请参阅http://php.net/crypt)
一种典型的策略是确定散列类型并在登录时更新散列,以便您可以无缝更新散列。理想情况下,您使用password_hash()
group of functions,因为它们会隐藏详细信息并阻止您错误地实施它。如果php开发人员改变他们的默认值(例如,因为它们被证明是不安全的),你的应用程序将在php更新后自动更新哈希值。
它们本身可以使用php 5.5,但对于php> = 5.3.7,可以在https://github.com/ircmaxell/password_compat找到兼容性库。它基本上完成了你上面写的,只是有更多选项,比如使用openssl,如果mcrypt不可用,它提供了标准的API。