Comparando el hash BCrypt entre PHP y NodeJS
bcrypt js (2)
Esto falla porque los tipos de hash bcrypt que se generan desde php y node son diferentes. Laravel genera el $2y$
mientras que el nodo genera el $2a$
. Pero la buena noticia es que la única diferencia entre 2a
y 2y
son sus prefijos.
Entonces, lo que puedes hacer es hacer que uno de los prefijos sea similar al otro. Me gusta:
$phpGeneratedHash = ''$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.'';
$nodeGeneratedHash = ''$2a$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO'';
A algo como:
$phpGeneratedHash = ''$2y$10$jOTwkwLVn6OeA/843CyIHu67ib4RixMa/N/pTJVhOjTddvrG8ge5.'';
$nodeGeneratedHash = ''$2y$10$ZiBH5JtTDtXqDajO6f4EbeBIXGwtcGg2MGwr90xTH9ki34SV6rZhO'';
Tenga en cuenta que reemplazé los $2a$
del hash de nodo a $2y$
. Simplemente puedes hacer esto con:
PHP
$finalNodeGeneratedHash = str_replace("$2a$", "$2y$", $nodeGeneratedHash);
Nodo
finalNodeGeneratedHash = nodeGeneratedHash.replace(''$2a$'', ''$2y$'');
Luego compare phpGeneratedHash
con finalNodeGeneratedHash
.
Nota: Se recomienda que si está comparando en PHP, cambie el prefijo del hash generado por NodeJS a
$2y$
y si esté comparando en NodeJS; cambia el prefijo del hash generado por PHP a$2a$
.
Para una aplicación en la que estoy trabajando, nodejs necesita verificar los hashes creados por PHP y viceversa.
El problema es que los hashes generados en PHP (a través de la clase Hash
de Laravel, que solo usa la función password_hash
de PHP) devuelven falso cuando se prueban en node.js.
El siguiente script 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''
);
salidas: ''PHP fail nodejs pass'', mientras que el siguiente script 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'';
Salidas ''PHP pass nodejs pass''.
He ejecutado las pruebas en Ubuntu 14.04.1 utilizando PHP 5.5.18, node.js v0.10.32 y el módulo npm bcrypt.
He tratado de calcular lo que se dijo antes para obtener códigos que funcionen. Como puede ver, no necesito reemplazar nada.
En el lado de PHP 7.2.4:
<?php
$password = "test123";
$hash = password_hash($password, PASSWORD_BCRYPT);
echo $hash; // I get $2y$10$5EaF4lMSCFWe7YqqxyBnR.QmDu1XhoiaQxrOFw.AJZkGCYmpsWDU6
En el lado de nodeJS:
Instale el paquete bcryptjs: npm i bcryptjs
var bcrypt = require(''bcryptjs'');
let hash1="$2y$10$5EaF4lMSCFWe7YqqxyBnR.QmDu1XhoiaQxrOFw.AJZkGCYmpsWDU6";
console.log(bcrypt.compareSync("test123", hash1)); // display true