Мой 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