如何在nodejs中正确加密密码
How to properly encrypt passwords in nodejs
我正在尝试使用 express 在 nodejs 中为网站加密密码。
这是我用来加密密码的函数:
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;
}
此代码的问题在于,如果我重新启动此代码,则密钥会有所不同,并且对于保存在数据库中的相同密码,我会得到不同的字符串。这是行不通的,因为当用户在尝试登录时提交时,我将无法使用哈希测试密码。
我怎样才能使我始终收到相同的加密字符串,是否有更安全的方式来处理所有事情,甚至可能是其他库可以更好地完成这项工作?
一般用nodejs bcryptjs是比较推荐的密码加解密模块
按照下面link以BcryptJs为例
我们可以使用 crypto 原生 nodejs 模块,查看下面的示例代码
const crypto = require('crypto');
const salt = crypto.randomBytes(16).toString('hex');
const hash = crypto.pbkdf2Sync("<password>", salt,
1000, 64, `sha512`).toString(`hex`)
更多示例代码:https://www.geeksforgeeks.org/node-js-password-hashing-crypto-module/
注意:所有加密操作都是 CPU 重度尝试尽可能使用异步函数。
使用 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(),
});
使用下面的代码比较密码。
const hashedPassword = CryptoJS.AES.decrypt(
user.password,
process.env.PASS_SEC
);
const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
if (user.password == originalPassword)
return user;
我正在尝试使用 express 在 nodejs 中为网站加密密码。
这是我用来加密密码的函数:
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;
}
此代码的问题在于,如果我重新启动此代码,则密钥会有所不同,并且对于保存在数据库中的相同密码,我会得到不同的字符串。这是行不通的,因为当用户在尝试登录时提交时,我将无法使用哈希测试密码。
我怎样才能使我始终收到相同的加密字符串,是否有更安全的方式来处理所有事情,甚至可能是其他库可以更好地完成这项工作?
一般用nodejs bcryptjs是比较推荐的密码加解密模块
按照下面link以BcryptJs为例
我们可以使用 crypto 原生 nodejs 模块,查看下面的示例代码
const crypto = require('crypto');
const salt = crypto.randomBytes(16).toString('hex');
const hash = crypto.pbkdf2Sync("<password>", salt,
1000, 64, `sha512`).toString(`hex`)
更多示例代码:https://www.geeksforgeeks.org/node-js-password-hashing-crypto-module/
注意:所有加密操作都是 CPU 重度尝试尽可能使用异步函数。
使用 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(),
});
使用下面的代码比较密码。
const hashedPassword = CryptoJS.AES.decrypt(
user.password,
process.env.PASS_SEC
);
const originalPassword = hashedPassword.toString(CryptoJS.enc.Utf8);
if (user.password == originalPassword)
return user;