3

私はPHPでDeviseRubyonRailsによって生成されたいくつかのパスワードを確認しようとしています。Deviseはbcryptを使用するように構成されました。

私のコードは次のとおりです。

$database_record = "$2a$10$..."; // generated by devise
$user_input = 'asdasd';
$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$');

if (crypt($user_input, $database_record) == $password) {
    echo "<br/>Password verified!";
}
else {
    echo '<br/>failed!'; }

私が見たドキュメントはこの方法を使用していますが、私には機能しません。私は何かを忘れていますか?「コショウのひも」はどうにか使われるべきですか?ありがとう!

4

4 に答える 4

3

私はこの部分について混乱しています。

$password = crypt($user_input, '$2a$10$usesomesillystringforsalt$');

ハッシュを作成し、それが bcrypt であることを保証する方法を指定するドキュメントの後半で混乱したと思います。あなたの場合、ハッシュを検証しているので、自動的にそれが行われます。

あなたがしたいことは、それをスキップして行うことです:

if (crypt($user_input, $database_record) == $database_record) {

したがって、これが期待どおりに機能する場合はcrypt($user_input, $database_record)、からソルトを取得し、$database_recordそれを使用して bcrypt on を実行し$user_inputます。$database_record次に、正しいパスワードの bcrypt ハッシュであるため、結果を再度比較します。

于 2012-07-18T15:21:57.467 に答える
2

PHP 5 >= 5.5.0 の使用

$pepper = 'xxxyyyzzz'; //get value from config/initializers/devise.rb
$password = '12345678'; //clear password to validate

$db_pass = '***************************'; //password stored on database

$options = [
    'salt' => substr($db_pass,7)
];

$ok = ($db_pass == password_hash($password.$pepper, PASSWORD_BCRYPT, $options));
于 2014-07-16T15:16:19.803 に答える
1

私は最終的にこれを修正する方法を発見しました。Devise はパスワードの末尾にコショウを追加してから暗号化を実行します。

作業コードは次のとおりです。

if (crypt($passwordToValidate.$pepper, $encryptedPassword) == $encryptedPassword)
   echo 'ok!';
else
   echo 'failed!';
于 2012-07-19T14:04:44.773 に答える
0

php が $2y のようなキーを生成したという事実に問題がありました ....... しかし、ルビー $2a ..... 詳細はこちらhttps://github.com/ircmaxell/password_compat/issues/49

于 2016-09-09T00:47:10.603 に答える