我正在查看PassportJS进行身份验证,并拥有一个包含用户名和密码的登录表单。但是,如果我查看文档,我会看到密码以明文形式传递。这意味着如果有人使用console.log(密码),密码将是可见的。如何确保登录表单提交的密码已加密?
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
答案 0 :(得分:1)
1)从客户端到服务器
使用SSL。
2)从服务器到磁盘/数据库
创建密码时,首先将其哈希并将哈希保存到磁盘。
稍后,在验证用户时,将提交的密码的哈希值与磁盘上的哈希值进行比较。
如果使用bcrypt
,则从passport-local examples看起来会像这样:
// Bcrypt middleware
userSchema.pre('save', function(next) {
var user = this;
if(!user.isModified('password')) return next();
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
if(err) return next(err);
bcrypt.hash(user.password, salt, function(err, hash) {
if(err) return next(err);
user.password = hash;
next();
});
});
});
// Password verification
userSchema.methods.comparePassword = function(candidatePassword, cb) {
bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
if(err) return cb(err);
cb(null, isMatch);
});
};
注意:除了护照本地之外,您还需要使用bcrypt或其他一些加密模块......但这并不是非常复杂,护照本地仓库中的示例几乎可以提供给您所有人我需要开始。