我正在尝试在MongoDB中存储密码和salt,我不确定应该使用哪种数据类型。当我使用字符串时,加密的密码似乎存储正确,但生成的盐(使用new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
创建)似乎具有无法识别的字符。例如,我有一个存储为 y_ 6j( l~Z} 0 \“的盐,我不认为这是正确的。
问题是它存储为字符串吗?
答案 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
}
});
});
希望它可以帮到你!