如何在保存到数据库之前对密码进行哈希处理以与护照模块兼容(本地护照)

Posted

技术标签:

【中文标题】如何在保存到数据库之前对密码进行哈希处理以与护照模块兼容(本地护照)【英文标题】:How to hash password before saving to db to be compatible with passport module (passport local) 【发布时间】:2016-10-06 17:24:36 【问题描述】:

我正在使用护照的本地护照策略进行身份验证。在我的快速服务器中,我收到了一个注册发布请求,我应该将密码保存到 db 以供新用户使用。但是我需要在保存到数据库之前对密码进行哈希处理。

但我不知道如何散列它,因为护照将通过散列登录密码凭据来验证用户身份,以匹配我来自 db.h 的散列密码。我应该如何散列我的密码?

我正在使用这个module。

【问题讨论】:

【参考方案1】:

当护照已经为我们提供了哈希算法时,我们为什么要使用哈希算法?我的意思是我们只需要将 passport-local-mongoose 插入到我们的用户模式中,例如:UserSchema.plugin(passportLocalMongoose),然后,在注册路由中,我们只需告诉 passportLocalMongoose 使用以下方法为我们进行哈希处理:

User.register(new User(username:req.body.username), req.body.password,function(err,newUser)
 
    if(err)
        something
    else
        something
    
)

通过上述操作,我们不需要处理散列,它会为我们完成。如果我错了或者你的问题错了,请纠正我。

【讨论】:

【参考方案2】:

passport-local 不会对您的密码进行哈希处理 - 它passes the credentials to your verify callback 用于验证,您负责处理凭据。因此,您可以使用任何哈希算法,但我相信bcrypt 是最流行的。

您在注册处理程序中对密码进行哈希处理:

app.post('/register', function(req, res, next) 
  // Whatever verifications and checks you need to perform here
  bcrypt.genSalt(10, function(err, salt) 
    if (err) return next(err);
    bcrypt.hash(req.body.password, salt, function(err, hash) 
      if (err) return next(err);
      newUser.password = hash; // Or however suits your setup
      // Store the user to the database, then send the response
    );
  );
);

然后在您的验证回调中,您将提供的密码与哈希值进行比较:

passport.use(new LocalStrategy(function(username, password, cb) 
  // Locate user first here
  bcrypt.compare(password, user.password, function(err, res) 
    if (err) return cb(err);
    if (res === false) 
      return cb(null, false);
     else 
      return cb(null, user);
    
  );
));

【讨论】:

我如何使用passport-local-mongoose 使用 PBKDF2 而不是 bcrypt 散列的包?【参考方案3】:

你试过了吗?

https://www.npmjs.com/package/passport-local-authenticate

var auth = require('passport-local-authenticate');

auth.hash('password', function(err, hashed) 
  console.log(hashed.hash); // Hashed password
  console.log(hashed.salt); // Salt
);

auth.hash('password', function(err, hashed) 
  auth.verify('password', hashed, function(err, verified) 
    console.log(verified); // True, passwords match
  ));
);

auth.hash('password', function(err, hashed) 
  auth.verify('password2', hashed, function(err, verified) 
    console.log(verified); // False, passwords don't match
  ));
);

【讨论】:

嘿伙计,我用我正在使用的模块编辑了我的帖子,你的链接是一个不同的模块。它可能适用于我的。 @FurkanO 如果您想要对密码进行哈希处理,那么您需要使用我链接的模块。 但是我的也做身份验证,它也应该需要一种哈希算法。我想每个人都知道或某事的标准方式。但如果没有人回答,我会使用你的。谢谢你的帖子。 @FurkanO 您可以同时使用这两个模块——password-local-authenticate 模块使用以下内容对密码进行哈希处理:nodejs.org/api/…

以上是关于如何在保存到数据库之前对密码进行哈希处理以与护照模块兼容(本地护照)的主要内容,如果未能解决你的问题,请参考以下文章

使用 SHA512 对密码进行哈希处理以加密数据

这实际上是如何完成的?

如何在将密码保存到用户模型 Django 之前对其进行加密?

如何在更换新护照之前检查密码是不是匹配

传输前散列密码? (网络)

如何在 Java 中使用 SHA-512 对密码进行哈希处理?