Investigamos en diferentes espacios y así brindarte la solución a tu duda, si tienes dificultades puedes dejarnos tu pregunta y responderemos porque estamos para ayudarte.
Solución:
Creo que tu problema está en la sal. Por lo general, debes almacenar la sal que usaste para hacer picadillo la primera vez y reutilizarla la segunda vez. La razón de la sal es asegurarse de que el hash no se corresponda con el pase original si algún pirata informático lo recupera de un sistema comprometido (usando un ataque de tabla de arco iris). Consulte ¿Por qué usamos la “sal” para proteger nuestras contraseñas?
Si lo intentaras
var salt = crypto.randomBytes(128).toString('base64');
var hashPwd = function hashPwd(salt, pwd)
var hmac = crypto.createHmac('sha256', salt);
return hmac.update(pwd).digest('hex');
;
//use password , create salt, hash and compare with the existing
var passHash = hashPwd(salt,data.Password);
console.log('the password is', user.PassHash === passHash);
Funcionaría siempre que no reinicie el servidor (suponiendo que almacene el salt
var fuera del alcance de la función invocada para responder a la solicitud http).
Una mejor solución (imo) es lo que está haciendo bcrypt. Allí generas un salt por contraseña, pero para verificar que una contraseña es correcta usas compare, que usa el salt almacenado en el hash. De esta manera, puede usar diferentes sales con cada contraseña, lo que significa que no tiene que preocuparse tanto por que una sal se vea comprometida.
npm install bcrypt
…
var bcrypt = require('bcrypt');
var hash = bcrypt.hashSync("my password");
bcrypt.compareSync("my password", hash); // true
bcrypt.compareSync("not my password", hash); // false
También hay compareAsync
y otras variantes asincrónicas. Véase también: https://www.npmjs.com/package/bcrypt-nodejs
Te invitamos a sustentar nuestra misión escribiendo un comentario o valorándolo te damos la bienvenida.