2016-05-21 5 views
3

だから質問はかなり^^のタイトルにある。PHP password_hash()+ password_verify()は安全です(2016年5月)?

以下は私のサーバーでパフォーマンスをテストするために行った少しのPHPコードです(結果のスクリーンショット)。また、password_hash()とpassword_verify()の使い方を示しています。

私はPASSWORD_BCRYPTと一緒に行くと思います。費用= 11あなたはどう思いますか?

<?php 
$startpage = microtime(true); 
$userPassword = "ILike5InchesIceCubes"; 
echo "<h2>Password we work on : " . $userPassword . "</h2></br></br>"; 


echo "<b>password_hash($userPassword, PASSWORD_BCRYPT) :</br></b>"; 
$start1 = microtime(true); 
$hash = password_hash($userPassword, PASSWORD_BCRYPT); 
echo "Hash is : " . $hash . "</br>"; 
echo "Encryption took : ". (microtime(true) - $start1) . " seconds </br>"; 
$start2 = microtime(true); 
password_verify($userPassword, $hash); 
echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>"; 

echo "<b>password_hash($userPassword, PASSWORD_DEFAULT) :</br></b>"; 
$start1 = microtime(true); 
$hash = password_hash($userPassword, PASSWORD_DEFAULT); 
echo "Hash is : " . $hash . "</br>"; 
echo "Encryption took : ". (microtime(true) - $start1) . " seconds </br>"; 
$start2 = microtime(true); 
password_verify($userPassword, $hash); 
echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>"; 

$cost = 4; 
do { 

     echo "<b>password_hash($userPassword, PASSWORD_BCRYPT, [\"cost\" =>" . $cost . "])</br></b>"; 
    $start1 = microtime(true); 
    $hash = password_hash($userPassword, PASSWORD_BCRYPT, ["cost" => $cost]); 
     echo "Hash is : " . $hash . "</br>"; 
     echo "Encryption took : ". (microtime(true) - $start1) ." seconds </br>"; 
     $start2 = microtime(true); 
     password_verify($userPassword, $hash); 
     echo "Password verification took : ". (microtime(true) - $start2) ." seconds </br></br>"; 

     $cost++; 

} while ($cost <= 16); 
$endpage = microtime(true); 

echo "The whole page took : ". ($endpage - $startpage) . " seconds </br>"; 
?> 

enter image description here

+3

はい。しかし、PASSWORD_DEFAULTを実行すると、サーバーのアップグレードによってハッシュアルゴリズムが同時にアップグレードされる可能性があります。これは、Bcrypt – JimL

+0

の代わりに新しいalgoが推奨されている場合に、パスワードハッシュのセキュリティを正常にアップグレードするためにこのように実装されています。正当な値段で –

+0

とお伝えします。あなたのことを確認してください。 1つの古典的なi7 CPU 8G RAMを使用して、実際の費用= 11実際のPASSWORD_DEFAULTを引き上げるのにどれくらい時間がかかりますか? – shrimpdrake

答えて

5

はい、password_hash()は移動するための方法です。 Security StackExchangeにはさらに詳しい情報が掲載されています。here

bcryptを使用するとよいスタートです。それは推奨される選択肢(または推奨される選択肢の少なくとも1つ)です。 documentationは、PHP が最終的にが正しく動作することを示しているようです。 PHPのバージョンが5.5.0以上であることを確認してください。塩をつくることはしないでください。デフォルトでは、関数は必要に応じてランダムな塩を生成します。これは正しい方法です。

「コスト」オプションも変更する必要があります。 bcryptの場合、コストは4〜31の範囲の値です。各増分は、サーバーと攻撃者の両方に対して、パスワードのハッシングが2倍の高価であることを意味します。実際には、サーバーの電力、平均負荷、ピーク負荷、最大限のユーザー忍耐を考慮すると、許容できる最大値を設定したいと考えています。これにより、最高のセキュリティを実現できます。

(私が言ったことに注意してください「最高」、「良い」ではない。)

あなたは良いパスワードハッシュのための基礎となる概念を理解したい場合は

、およびbcryptのは良い選択、 start hereがある理由。

password_hash()が大幅にPHP 5.5以降で改善されました、そしてこれは、PASSWORD_BCRYPTと一緒に、行くには良い方法である必要があります。

関連する問題