0

我找到了这个示例如何使用 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);
}
4

1 回答 1

2

哈希算法对我来说看起来不错,除了您使用$2a$的是$2y$. 从crypt() 手册页

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

此外,08除非您使用非常旧的硬件,否则用作成本参数非常弱。您想尝试尽可能长时间地散列而不给用户带来不便。通常 250 毫秒是可以接受的。在我的台式电脑(不是那么现代)上,这相当于11,所以对于一台像样的服务器,您可能至少需要这么多。尝试使用该参数,直到获得一个需要这么长时间来计算/验证哈希并使用它的数字。

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

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

于 2013-07-29T19:57:46.563 回答