2

次のコード スニペットがあります。

// bcrypt hash of 'password'
$hash = '$2y$10$4u0cQ.WEnwHDo.C5Nl1vm.shKA0beQ32wqzphSfzklAq9OcDM2nLu';
if(password_verify('password', $hash)) {
    print_r('woohoo!');
}
else {
    print_r('fubar');
}

あるサーバーでは正常に動作していますが (woohoo!)、別のサーバーでは動作しません。codepad.org に掲載したところ、そこでも失敗します。

問題は (コードパッドのページでわかるように) によって計算されたハッシュcryptの長さが、必要な 60 ではなく 13 であることです。

PHP 5.5 のみの機能を実装するために、github でircmaxel の password_compat ライブラリを使用していpassword_verifyます。

4

1 に答える 1

2

5.3.7より前のPHPバージョンでスクリプトを実行しているようです。したがって、アルゴリズム「2y」はまだ不明です。

可能であれば、このサーバーでPHPのアップグレードを行うことを検討します。「2y」パラメーターは、Unicode入力文字列の問題を解決します。

これがオプションでない場合は、互換性パックのアルゴリズムを置き換えることができます。49行目あたりのどこかにあります...

$hash_format = sprintf("$2y$%02d$", $cost);

...以前のBCrypt定数「2a」に変更します...

$hash_format = sprintf("$2a$%02d$", $cost);

...これはもちろん最適ではありませんが、以前のバージョンで実行できる最善の方法です。

新しく生成されたパスワードハッシュはで始まり'$2a$10$...'、このハッシュ値による検証はすべてのシステムで機能するはずです。

于 2013-02-26T14:10:55.873 に答える