27

password_hash私のphpコードは、データベースに保存するハッシュを生成します。以下はPHPコードです。

$hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost));

nodejsでこのハッシュに対してパスワードを検証/チェックしたいと思います。

多くのノード モジュール (bcrypt、phpass、node-bcrypt) を見ましたが、それらはすべて false です。以下は、php で生成されたサンプル ハッシュで、nodejs で検証しようとしています。

var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2';

var bcrypt = require('bcrypt');

bcrypt.compare("secret", hash, function(err, res) {
    console.log(res);
});

(ここでシークレットは本当のパスワードです)

私の現在の回避策は、ノードを介してphpスクリプトを呼び出して確認することです(回避策が必要な人向け)

var exec = require('child_process').exec;
var cmd = 'php verify.php password encryped_pasword';
exec(cmd, function (error, stdout, stderr) {
  // output is in stdout
  console.log(stdout);
 //If stdout has 1 it satisfies else false
});

これはハックであり、この問題に対する良い答えではありません。このような回避策を使用せずに nodejs でパスワードを確認する方法はありますか?

4

2 に答える 2

57

ハッシュ化されたパスワードの $2y$ を $2a$ に置き換えます。bcrypt.compare で正しい結果が得られるはずです。

var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2';
var bcrypt = require('bcrypt');
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1');
bcrypt.compare("secret", hash, function(err, res) {
    console.log(res);
});

ES6:

import bcrypt from 'bcrypt';
let hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2';
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1');
bcrypt.compare('secret', hash, function(err, res) {
    console.log(res);
});
于 2014-12-07T10:42:40.987 に答える
27

これが回答されたことは知っていますが、コメントからはもう少し詳細が必要なようです。

php password_hash() 関数によって生成された Bcrypt ハッシュは、次のように分割されます。

$2y$ 08$ 9TTThrthZhTOcoHELRjuN. 3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2

|     |     |                     |
|     |     Salt                  Hashed Password
|     |
|     Algorithm options (cost, in this case)
|
Algorithm type

SOに関する他の回答から、BcryptのPHPバージョンとNodeバージョンは異なるアルゴリズムを使用していますが、ハッシュ出力の唯一の違いはプレフィックスです。必要なのは、@Sudesh が述べたように、$2y$a$2a$とボブの叔父を交換することだけです。

ソース

http://php.net/manual/en/faq.passwords.php

Node.js での $2y の bcrypt ハッシュ

PHP と NodeJS の BCrypt ハッシュの比較

于 2016-09-26T09:59:10.370 に答える