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

Для приложения, над которым я работаю, 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.

Solutions Collecting From Web of "Сравнение хэша BCrypt между PHP и NodeJS"

Это терпит неудачу, потому что типы хэшей 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$ . Вы можете просто сделать это с помощью:

PHP

 $finalNodeGeneratedHash = str_replace("$2a$", "$2y$", $nodeGeneratedHash); 

Узел

 finalNodeGeneratedHash = nodeGeneratedHash.replace('$2a$', '$2y$'); 

Затем сравните phpGeneratedHash с finalNodeGeneratedHash .

Примечание. Если вы сравниваете PHP, измените префикс генерируемого хеша NodeJS на $2y$ и если вы сравниваете его в NodeJS; измените префикс PHP-хэша на $2a$ .