unhash password node example encrypt crypto php node.js security bcrypt php-password-hash

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

http://php.net/manual/en/faq.passwords.php

$ 2y bcrypt hashes en Node.js

Comparando el hash BCrypt entre PHP y NodeJS