password - Verifique el hash de la contraseña en nodejs que se generó en php
crypto npm (2)
Mi código php genera un hash usando password_hash
que almaceno en una base de datos. A continuación se muestra el código PHP:
$hash = password_hash($value, PASSWORD_BCRYPT, array(''cost'' => $cost));
Me gustaría verificar / verificar la contraseña contra este hash en nodejs.
Vi muchos módulos de nodo (bcrypt, phpass, node-bcrypt), pero todos ellos me dan falso. A continuación se muestra el hash de muestra generado en php y que estoy intentando verificar en nodejs.
var hash = ''$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'';
var bcrypt = require(''bcrypt'');
bcrypt.compare("secret", hash, function(err, res) {
console.log(res);
});
(Aquí el secreto es la contraseña real)
Mi solución actual es llamar a un script php a través de un nodo para verificar (para cualquiera que necesite una solución)
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
});
Este es un truco y no es una buena respuesta a este problema. ¿Hay alguna forma de verificar la contraseña en nodejs sin usar una solución como esta?
Reemplace $ 2y $ en la contraseña con hash con $ 2a $ , luego bcrypt.compare le dará el resultado correcto.
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);
});
en 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);
});
Sé que esto ha sido respondido, pero parece por los comentarios que se requiere un poco más de detalle.
Los hash de Bcrypt producidos por la función php password_hash () se dividen de la siguiente manera:
$2y$
08$
9TTThrthZhTOcoHELRjuN.
3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2
| | | |
| | Salt Hashed Password
| |
| Algorithm options (cost, in this case)
|
Algorithm type
Parece por otras respuestas aquí en SO que si bien las versiones PHP y Node de Bcrypt usan diferentes algoritmos, la única diferencia en la salida de hash es el prefijo. Así que todo lo que se requiere es, como lo menciona @Sudesh, cambiar los $2y$
por $2a$
y Bob es tu tío.
Fuentes