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 以降のみを対象とする開発者は、「$2a$」ではなく「$2y$」を使用する必要があります。

また、08非常に古いハードウェアを使用していない限り、コスト パラメータとしての使用は非常に弱いです。ユーザーに不便を与えることなく、ハッシュにできるだけ時間がかかるようにしたいと考えています。通常は 250 ミリ秒が許容範囲です。私のデスクトップ PC (それほど近代的ではない) では、これは に相当する11ため、適切なサーバーを使用する場合、少なくともこれだけは必要になるでしょう。ハッシュを計算/検証してそれを使用するのにこれほど長い時間がかかる数値が得られるまで、そのパラメーターをいじってみてください。

もう 1 つのかなり大きな懸念は、塩をどのように生成しているかということですが、それをどのように行っているかがわからないため、批判できることはあまりありません。

とはいえ、自作のパスワード ハッシュ アルゴリズムを作成することを忘れて、代わりに PHP に組み込まれているpassword_hash()関数を使用するのが断然ベスト プラクティスです。(PHP < 5.5 の場合は、githubから互換パックをダウンロードできます)。

于 2013-07-29T19:57:46.563 に答える