Actualmente estoy tratando de implementar un servicio de restablecimiento de contraseña con NodeJS usando Bcrypt. He creado un hash de un objeto como este:
const userData = { dateNow, userId: foundUser.rows[0].user_id, passwordHash: foundUser.rows[0].user_password, email: foundUser.rows[0].user_email }; const userDataHash = await hashUserData(userData, 10); Donde userDataHash es:
const hashUserData = async (userData, saltRounds) => { let hashedData = await bcrypt.hash(JSON.stringify(userData), saltRounds); if (hashedData.includes('/') || hashedData.includes('.')) { hashedData = hashUserData(userData, saltRounds); } console.log('hashUserData', hashedData) return hashedData; };La función hash es un poco complicada porque forma parte de la URL de restablecimiento. No quiero ningún hash con / o .
Luego, el hash del objeto de datos de usuario se agrega a una URL. Cuando el usuario hace clic en el enlace y se le lleva al restablecimiento de contraseña, cuando envía el formulario, el hash de la URL se envía junto con la ID de usuario de la cuenta para restablecer, esta ID se usa para crear un objeto de los mismos datos. utilizado originalmente para crear el hash, de modo que si el hash de la contraseña ya se ha cambiado, el hash no coincidirá, lo que impedirá que la persona actualice su contraseña.
Mi problema es que incluso cuando cambia el hash de la contraseña, la comparación de hash devuelve verdadero. Si cambio algo más en el objeto, la comparación hash devuelve falso.
const compareHash = async (toCompare, currentHash) => { return await bcrypt.compare(toCompare, currentHash) }; const userDataToCheck = { dateNow: req.params.dateNow, userId, passwordHash: foundUser.rows[0].user_password, email: foundUser.rows[0].user_email }; const hashesMatch = await compareHash(JSON.stringify(userDataToCheck), req.params.userDataHash) Donde req.params.userDataHash es el hash original que utiliza el hash de contraseña original en el objeto.
¡Cualquier ayuda apreciada!