Проверьте хэш пароля в 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