我应该如何在MongoDB中存储盐和密码

时间:2017-03-29 11:20:40

标签: node.js mongodb

我正在尝试在MongoDB中存储密码和salt,我不确定应该使用哪种数据类型。当我使用字符串时,加密的密码似乎存储正确,但生成的盐(使用new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');创建)似乎具有无法识别的字符。例如,我有一个存储为 y_ 6j( l~Z} 0 \“的盐,我不认为这是正确的。

问题是它存储为字符串吗?

1 个答案:

答案 0 :(得分:10)

注册用户时,您可以使用bcrypt生成哈希密码。我们将此密码称为P#1。将此哈希密码(P#1)保存在数据库中,而不是盐。

登录用户时,生成用户发送的密码的哈希版本,让我们称之为P#2。现在,您只需匹配P#P#2。如果匹配,则对用户进行身份验证。这样,您可以执行身份验证,而无需在数据库中实际保存salt。

我将尝试在一个例子的帮助下以简单的方式表达它。

// My user schema

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt-nodejs');

var userSchema = new Schema({
  username: String
  password: String,
});

// hash the password
userSchema.methods.generateHash = function(password) {
  return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

// checking if password is valid
userSchema.methods.validPassword = function(password) {
  return bcrypt.compareSync(password, this.password);
};
var User = mongoose.model('user', userSchema);
module.exports = User;


// My APIs for registering and authenticating a user

var User = require('/path/to/user/model');

app.post('/register', function(req, res) {
  var new_user = new User({
    username: req.username
  });

  new_user.password = new_user.generateHash(userInfo.password);
  new_user.save();
});

app.post('/login', function(req, res) {
  User.findOne({username: req.body.username}, function(err, user) {

    if (!user.validPassword(req.body.password)) {
      //password did not match
    } else {
      // password matched. proceed forward
    }
  });
});

希望它可以帮到你!