我正在阅读meanjs的源代码,我的问题是带有代码的hashPassword方法:
UserSchema.methods.hashPassword = function(password) {
if (this.salt && password) {
return crypto.pbkdf2Sync(password, this.salt, 10000, 64).toString('base64');
} else {
return password;
}
};
在这里,我无法理解为什么它会返回密码,以防这个.salt&&密码是假的?据我所知,这是一个问题,也许应该停止保存用户,对吗?
答案 0 :(得分:2)
直接在hashPassword函数定义之前,你应该看到这个块:
/**
* Hook a pre save method to hash the password
*/
UserSchema.pre('save', function(next) {
if (this.password && this.password.length > 6) {
this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
this.password = this.hashPassword(this.password);
}
next();
});
如您所见,在调用hashPassword之前会生成一个salt。如果您正确使用meanjs,则永远不会返回普通密码。如果salt由于任何原因未定义,而不是抛出错误,它会继续并以纯文本格式保存密码。
答案 1 :(得分:1)
我在使用此方法时遇到了一些问题并将其更改为
if (this.password && this.password.length > 6) {
if (!this.salt || this.salt.length === 0) {
this.salt = crypto.randomBytes(16).toString('base64');
this.password = this.hashPassword(this.password);
}
}
问题是,如果您在初始保存后尝试再次保存用户,则无法使用该用户详细信息登录。 会发生什么情况会使用salt来加密已经加密的密码,这在我看来是错误的。
因此,处理该问题的两个选项之一就是在调用save之前总是将用户密码设置为空字符串,或者你做了我做过的事情或者那些事情。