我发现这个例子是如何用PHP散列和检查密码的。这样安全吗?这是一个很好的例子吗?
public function hashPassword($mail, $password, $salt, $rounds='08')
{
$length = strlen($password) * 4;
$data = str_pad($password, $length, sha1($mail), STR_PAD_BOTH);
$string = hash_hmac('whirlpool', $data, SERVER_KEY, true);
return crypt($string, '$2a$' . $rounds . '$' . $salt);
}
public static function checkPassword($mail, $password, $stored)
{
$length = strlen($password) * 4;
$data = str_pad($password, $length, sha1($mail), STR_PAD_BOTH);
$string = hash_hmac ('whirlpool', $data, SERVER_KEY, true);
return (crypt($string, substr($stored, 0, 30)) === $stored);
}
答案 0 :(得分:2)
除了您使用$2a$
而不是$2y$
这一事实外,哈希算法对我来说还不错。来自crypt() man page:
仅针对PHP 5.3.7及更高版本的开发人员应使用“$ 2y $”而不是“$ 2a $”
此外,使用08
作为成本参数非常弱,除非您使用的是非常旧的硬件。您希望尽可能长时间地进行哈希处理而不会给用户带来不便。通常250毫秒是可以接受的。在我的桌面PC上(这不是那么现代)这相当于11
,所以对于一个体面的服务器,你可能至少需要这么多。尝试使用该参数,直到你得到一个数字,用来计算/验证哈希并使用它。
另一个相当大的问题是你如何产生盐,但由于我们不知道你是如何做到的,所以没有太多可以批评的。
尽管如此,到目前为止,最好的做法是忘记制作家酿密码哈希算法,而是使用PHP内置的password_hash()函数。 (对于PHP< 5.5,您可以从github下载兼容包。)