Для приложения, над которым я работаю, nodejs необходимо проверить хэши, созданные PHP и наоборот.
Проблема в том, что хэши, созданные в PHP (через класс Hash
Laravel, который просто использует функцию password_hash
PHP), возвращают false при тестировании в node.js.
Следующий скрипт node.js:
var bcrypt = require('bcrypt'); var password = 'password'; var phpGeneratedHash = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.'; var nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO'; console.log( bcrypt.compareSync(password, phpGeneratedHash) ? 'PHP passed' : 'PHP failed', bcrypt.compareSync(password, nodeGeneratedHash) ? 'nodejs passed' : 'nodejs failed' );
выходы: «PHP failed nodejs прошел», тогда как следующий скрипт PHP:
<?php $password = 'password'; $phpGeneratedHash = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.'; $nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO'; print password_verify($password, $phpGeneratedHash) ? 'PHP passed' : 'PHP failed'; print password_verify($password, $nodeGeneratedHash) ? 'nodejs passed' : 'nodejs failed';
выходы «PHP передан nodejs прошло».
Я запустил тесты в Ubuntu 14.04.1, используя PHP 5.5.18, node.js v0.10.32 и модуль npm bcrypt.
Это терпит неудачу, потому что типы хэшей bcrypt, генерируемые из php и узла, различны. Laravel генерирует $2y$
а узел генерирует $2a$
. Но хорошие новости – единственная разница между 2a
и 2y
– их префиксы.
Итак, что вы можете сделать, это сделать один из префиксов похожим на другой. Подобно:
$phpGeneratedHash = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.'; $nodeGeneratedHash = '$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';
К чему-то вроде:
$phpGeneratedHash = '$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.'; $nodeGeneratedHash = '$2y$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO';
Обратите внимание, что я заменил $2a$
хэша узла на $2y$
. Вы можете просто сделать это с помощью:
$finalNodeGeneratedHash = str_replace("$2a$", "$2y$", $nodeGeneratedHash);
finalNodeGeneratedHash = nodeGeneratedHash.replace('$2a$', '$2y$');
Затем сравните phpGeneratedHash
с finalNodeGeneratedHash
.
Примечание. Если вы сравниваете PHP, измените префикс генерируемого хеша NodeJS на
$2y$
и если вы сравниваете его в NodeJS; измените префикс PHP-хэша на$2a$
.