php node.js bcrypt

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