Проверьте хэш пароля в nodejs, который был сгенерирован в php

Мой php-код генерирует хеш с помощью password_hash, который я храню в базе данных. Ниже приведен код PHP:

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

Я хотел бы проверить/проверить пароль на этот хэш в nodejs.

Я видел много модулей node (bcrypt, phpass, node -bcrypt), но все они дают мне ложные. Ниже приведен образец хэша, сгенерированный в php и который я пытаюсь проверить в nodejs.

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

var bcrypt = require('bcrypt');

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

(Здесь секрет - реальный пароль)

Моим текущим обходным решением является вызов php script через node для проверки (для тех, кому необходим обходной путь)

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 без использования обходного пути, подобного этому?

Ответ 1

Замените $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);
});

Ответ 2

Я знаю, что на это был дан ответ, но из комментариев видно, что требуется немного больше деталей.

Хэши Bcrypt, созданные функцией php password_hash(), разбиваются следующим образом:

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

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

Похоже, что из других ответов здесь на SO, что, хотя PHP и Node версии Bcrypt используют разные алгоритмы, единственным отличием хэш-вывода является префикс. Итак, все, что требуется, - это, как упоминалось @Sudesh, для обмена $2y$ для $2a$ и Боба вашего дяди.

Источники

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

$2y bcrypt хэши в Node.js

Сравнение хэширования BCrypt между PHP и NodeJS