Estoy tratando de cifrar contraseñas en nodejs para un sitio web usando express.
Aquí está la función que uso para cifrar las contraseñas:
const crypto = require('crypto'); // the problem const key = crypto.randomBytes(32); const iv = crypto.randomBytes(16); encrypt(str) { const cipher = crypto.createCipheriv('aes-256-cbc', key, iv); let encrypted = cipher.update(str, 'utf8', 'hex'); encrypted += cipher.final('hex'); console.log(encrypted); return encrypted; }El problema con este código es que si tuviera que reiniciar esto, la clave sería diferente y obtendría diferentes cadenas para la misma contraseña que está guardada en la base de datos. Esto no funcionaría porque no podré probar la contraseña con el hash cuando un usuario envíe cuando intente iniciar sesión.
¿Cómo puedo hacer que siempre reciba la misma cadena cifrada? ¿Existe una forma más segura de hacer todo, tal vez incluso otras bibliotecas que harían mejor el trabajo?
Normalmente, con nodejs bcryptjs es un módulo más sugerido para el cifrado y descifrado de contraseñas.
Siga el enlace a continuación para tomar un ejemplo de BcryptJs
podemos usar crypto un módulo nativo de nodejs, verifique el código de muestra a continuación
const crypto = require('crypto'); const salt = crypto.randomBytes(16).toString('hex'); const hash = crypto.pbkdf2Sync("<password>", salt, 1000, 64, `sha512`).toString(`hex`)Más código de muestra: https://www.geeksforgeeks.org/node-js-password-hashing-crypto-module/
Nota: todas las operaciones crípticas son pesadas para la CPU, intente usar la función asíncrona siempre que sea posible.
Use la biblioteca Crypto-Js npm.
const CryptoJS = require("crypto-js"); const doc = await Users.create({ password: CryptoJS.AES.encrypt( req.body.password, process.env.PASS_SEC ).toString(), });Para comparar la contraseña, use el siguiente código.
const hashedPassword = CryptoJS.AES.decrypt( user.password, process.env.PASS_SEC ); const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8); if (user.password == originalPassword) return user;Referencia: https://www.npmjs.com/package/crypto-js