我试图弄清楚如何使用加密模块在NodeJ中加密和散列密码.我可以通过以下方式创建哈希密码:

UserSchema.pre('save', function(next) {
  var user = this;

  var salt = crypto.randomBytes(128).toString('base64');
  crypto.pbkdf2(user.password, salt, 10000, 512, function(err, derivedKey) {
    user.password = derivedKey;
    next();
  });
});

然而,我对以后如何验证密码感到困惑.

UserSchema.methods.validPassword = function(password) {    
  // need to salt and hash this password I think to compare
  // how to I get the salt?
}

推荐答案

在您使用的任何持久化机制(数据库)中,您都会将生成的哈希值与salt和迭代次数一起存储,这两项都是明文.如果每个密码使用不同的salt(您应该这样做),您还必须保存该信息.

然后比较新的纯文本密码,使用相同的salt(和迭代)对其进行哈希,然后将字节序列与存储的字节序列进行比较.

To generate the password (pseudo)

function hashPassword(password) {
    var salt = crypto.randomBytes(128).toString('base64');
    var iterations = 10000;
    var hash = pbkdf2(password, salt, iterations);

    return {
        salt: salt,
        hash: hash,
        iterations: iterations
    };
}

To validate password (pseudo)

function isPasswordCorrect(savedHash, savedSalt, savedIterations, passwordAttempt) {
    return savedHash == pbkdf2(passwordAttempt, savedSalt, savedIterations);
}

Node.js相关问答推荐

链接Inbox类方法,范围在哪里以及为什么发生变化?

CloudTasksClient在Firebase Function % s onDocumentCreated中实例化时导致错误

即使DDB键不存在, node Lambda也不会失败,并返回NULL作为结果

使用ReadableStream.管道时NodeJS Crypto Hash不正确

dayjs的isSameOrAfter方法未按预期工作

如何在 JavaScript 中显示多维数组中使用的一维数组的变量名?

Next.js 在我的电脑上没有构建错误,但它们在使用 Vercel 部署时发生

为什么要加密 CSRF 令牌?

Nodejs mongoose 在一个查询中从多个集合中获取结果

从数据库读取数据并将其作为可下载的 zip 文件发送

获取数组的至少一个元素包含子字符串的文档

带权限的机密 Rest-Api - 总是 403 - 我做错了什么?

使用 mongoose 查找过go 7 天的注册用户总数

如何在 mongoDB 中用值 0 填充缺失的文档?

node.js 中 res.setHeader 和 res.header 的区别

node_modules 中 .bin 文件夹的用途是什么?

node.js(ES6 / Babel)中 import X 和 import * as X 的区别?

fs.createWriteStream 不会立即创建文件?

expressjs app.VERB 调用中的 next() 和 next('route') 有什么区别?

Mongoose - 验证邮箱语法