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

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

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

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

Я видел множество модулей узлов (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-скрипта через узел для проверки (для тех, кому требуется обходной путь)

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

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

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

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

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

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

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

источники

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

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

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