hasjs中的哈希密码

时间:2015-02-25 00:47:30

标签: angularjs hash passwords meanjs

我正在阅读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&&密码是假的?据我所知,这是一个问题,也许应该停止保存用户,对吗?

2 个答案:

答案 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之前总是将用户密码设置为空字符串,或者你做了我做过的事情或者那些事情。