PHP:这个密码加密安全吗?

时间:2013-07-18 06:38:07

标签: php password-encryption

我发现这个例子是如何用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);
}

1 个答案:

答案 0 :(得分:2)

除了您使用$2a$而不是$2y$这一事实外,哈希算法对我来说还不错。来自crypt() man page

  仅针对PHP 5.3.7及更高版本的开发人员应使用“$ 2y $”而不是“$ 2a $”

此外,使用08作为成本参数非常弱,除非您使用的是非常旧的硬件。您希望尽可能长时间地进行哈希处理而不会给用户带来不便。通常250毫秒是可以接受的。在我的桌面PC上(这不是那么现代)这相当于11,所以对于一个体面的服务器,你可能至少需要这么多。尝试使用该参数,直到你得到一个数字,用来计算/验证哈希并使用它。

另一个相当大的问题是你如何产生盐,但由于我们不知道你是如何做到的,所以没有太多可以批评的。

尽管如此,到目前为止,最好的做法是忘记制作家酿密码哈希算法,而是使用PHP内置的password_hash()函数。 (对于PHP< 5.5,您可以从github下载兼容包。)