2017-09-03 11 views
0

具体的には、この定数は、新しいより強力なアルゴリズムがPHPに追加されるように経時的に変化するように設計されていることに注意してください」php pagePHPのpassword_hash()は下位互換ですか?

通り、PASSWORD_DEFAULTアルゴリズムを使用する。そのため、使用してから結果の長さをこの識別子は時間の経過とともに変更される可能性があるため、60文字を超えて拡張できるデータベース列に結果を格納することをお勧めします(255文字が良い選択です)。

「注:この機能によってサポートされているアルゴリズムへの更新(またはデフォルト1への変更)は、次の規則に従う必要があります。 は、すべての新しいアルゴリズムは、PHP前の少なくとも1つのフルリリースのコアでなければなりませんたとえば、新しいアルゴリズムが7.5.5に追加された場合、7.7まではデフォルトには適格ではない(7.6が最初の完全なリリースになるため)7.6で別のアルゴリズムが追加された場合。 0であれば、デフォルトの7.7.0にもなります。 デフォルトはフルリリース(7.3.0,8.0.0など)でのみ変更し、リビジョンリリースでは変更しないでください。現在のデフォルトで重大なセキュリティ上の欠陥が見つかった場合の緊急事態。

PHPをPASSWORD_DEFAULTに別のアルゴリズムを使用するバージョンにアップグレードすると、パスワードが古いアルゴリズムでハッシュされた場合、ユーザーはログインできなくなりますか?

+1

'password_verify'のドキュメントを参照してください – PeeHaa

+0

ありがとうございました。 password_hash()は、返されたハッシュの一部としてアルゴリズム、コスト、塩を返します。したがって、ハッシュを検証するために必要なすべての情報が含まれています。塩またはアルゴリズムの情報」 – GregCatalano

答えて

1

を短い答えはイエス、それはあなたのストレージが長いパスワードハッシュの長さを可能提供、下位互換性があります。

パスワードを生成すると、特定の形式で取得されます。

私はbcryptとより新しいargon2iハッシュを使用して2つのパスワードを生成しました。 FYI

libsodiumの導入により、PHP 7.2で来る):ここに私のコードは、私は7.2がダウンロードPHP持っていない、とだけエイリアスのためsodium_compatをインストールするつもりではなかったので、libsodiumの拡張子に基づいています。 PHP 7.2の構文には名前空間は含まれません。

$bcrypt = password_hash('insecurepassword', PASSWORD_BCRYPT); 
$argon2i = \Sodium\crypto_pwhash_str('insecurepassword', \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE); 

var_dump($bcrypt, $argon2i); 

私はそれを実行したときに私が得た出力は、両方のパスワードが多かれ少なかれ同じ形式である

string(60) "$2y$10$jiT0NF3u426kguHes8ZBputRE/n9OSdPi5HhHvEWW4mX1XDwKwy1e" 
string(96) "$argon2i$v=19$m=32768,t=4,p=1$Ho4Vzgp5nzQkLlp99P+ViA$bDqX8UUlSnfLRCfFBzBnFhWr/hzHzuuUCfZ0LSIns64" 

この

ました。 $を爆発させると、パスワードを確認するために必要なパズルの各部分が完成します。

最初のセクションにアルゴリズムが含まれています。 2ybcryptargon2iはアルゴン2i。 (驚き!)

次のビットには設定オプションが含まれているので、bcryptの場合はコストです。 argon2iの場合、いくつかの追加設定があります。

最後のセクションには、チェックするアルゴリズムの実際のパスワードと塩が含まれています。

もう少し視覚的な内訳をチェックアウトのためphp docs

いくつかの出力をデモンストレーションするためにいくつかの異なる機能を使用しましたが、が受け入れられ、argon2iハッシュのサポートが導入されました。これは、7.の機能です。

だから、password_verifyは、パスワードを確認するためにbcryptまたはargon2iハッシュを指定した場合でも、「正常に機能します」となります。

+0

驚くばかりの答え、ありがとう。私はアルゴリズムがハッシュに格納されていたことを認識しませんでした。 – GregCatalano

1

一方向ハッシュアルゴリズムですか、ハッシュを復号化することはできません。

使用password_verifyチェックするためのパスワードが保存されたハッシュと一致した場合、:

<?php 
    $hash = 'your-hash'; 

    if (password_verify('pass', $hash)) { 
    echo 'Password is valid'; 
    } else { 
    echo 'Password is not valid!'; 
    }