Javascript 当密码包含数字时,bcrypt compare返回false

Javascript 当密码包含数字时,bcrypt compare返回false,javascript,node.js,express,bcrypt,Javascript,Node.js,Express,Bcrypt,我正在使用PostgreSQL(via)来散列和保存密码 用户密码在beforeValidatehook中散列,如下所示: beforeValidate: function(user, model, cb) { bcrypt.hash(user.password, 10, function(err, hash) { if ( err ) { throw err; } user.password = hash; cb(nu

我正在使用PostgreSQL(via)来散列和保存密码

用户密码在
beforeValidate
hook中散列,如下所示:

beforeValidate: function(user, model, cb) {
        bcrypt.hash(user.password, 10, function(err, hash) {
          if ( err ) { throw err; }
          user.password = hash;
          cb(null, user);
        });
      }
用户模型中存储哈希的列定义为:

password: { type: DataTypes.STRING, allowNull: false }
当用户登录时(我使用它进行身份验证),函数如下所示:

passport.use(new LocalStrategy(function(username, password, done) {
    models.User.find({ username: username }).then(function(retrievedUser) {
      if ( !_.isEmpty(retrievedUser) ) {
        retrievedUser.verifyPassword(password, function(err, result) {
          if ( err || !result ) {
            return done(null, false, { message: 'Incorrect password.' });
          } else {
            return done(null, retrievedUser);
          }
        });
      } else {
        return done(null, false, { message: 'User could not be found at that username.' });
      }
    }).catch(function(err) {
      return done(err);
    });
  }));
它正确地检索用户

以及在用户模型上定义的比较:

instanceMethods: {
      verifyPassword: function(password, cb) {
        bcrypt.compare(password, this.password, cb);
      }
    }

如果密码只包含字母和/或符号,验证就可以通过。但是,任何带有数字的密码都无法通过比较。有什么想法吗?

在验证之前,在您的
函数中,您要传递10作为生成salt所需的salt,请将该函数更改为此

beforeValidate: function(user, model, cb) {
    var salt = bcrypt.genSalt(10);
    bcrypt.hash(user.password, salt, function(err, hash) {
      if ( err ) { throw err; }
      user.password = hash;
      cb(null, user);
    });
  }
嗯,令人尴尬的是(正如一些人所怀疑的),这与Bcrypt完全无关

在我的身份验证函数中,我试图通过以下方式获取适当的用户:

models.User.find({ username: username })
但是,应该在
where
字段中指定查询,如下所示:

models.User.find({
   where: { username: username }
})

这导致身份验证方法总是与数据库中第一个用户的密码进行比较(当未指定
时,默认情况下返回
,其中指定了
字段)。因此,它似乎起作用,因为第一个用户的字母密码始终起作用,但后续密码不起作用(实际上,对于其他用户来说,即使只有字母的密码也会失败).

您确定数据库中的哈希值正确吗?可能是您在创建哈希值之前意外地将密码小写了?@loganfsmyth只是再次检查以确保这不是问题所在,看起来大写字母实际上可以正常工作。问题只在于符号和数字(编辑原始帖子)您使用的是哪个模块?有许多bcrypt实现。@AaronDufour我使用的是我原始帖子中链接的实现。我相信这是正式的节点实现?我认为这与bcrypt无关。我假设您的字母密码只匹配,因为JS中的自动类型转换。应该是helpful如果你能在这两种情况下都为哈希调用提供准确的输入。我想可能也是这样,但文档上说:“salt-[必需]-用于哈希密码的salt。如果指定为数字,那么将生成并使用salt(参见示例)。”并不是说它没有引起问题(我没有测试它)但这似乎是允许的。