18

我很难让我的密码成功地与使用节点的 bcrypt 进行比较。也许我错过了一些东西,但在创建帐户时,我在注册方法中执行以下操作(一些代码缩写):

bcrypt.genSalt(10, function(err, salt) {
               if(err) {

               }
               bcrypt.hash(user.Password, salt, function(err, hash) {
                           console.log('hashing and saving');
                           db.query(db insert code, function (error, rows, fields) {
                                    if(error) {
                                    console.log(error);
                                    res.setHeader('500', { 'Content-Type': 'x-application/json'});
                                    res.send({UserId: 0, ErrorMessage: 'Something terrible happened.'});
                                    } else {
                                    console.log('User created : ' + rows.insertId);
                                    res.setHeader('200', { 'Content-Type': 'x-application/json'});
                                    res.send({UserId: rows.insertId});
                                    }
                                    });
                           });
               });

return next();

这一切都很好。我的数据库有加密的密码。但是当用户登录时,我无法从 bcrypt.compare 获得成功的结果:

db.query(get account code, function(error, rows, fields) {
         if(rows.length == 1) {
           bcrypt.compare(request.params.password, rows[0].Password, function(err,res) {
              if(err) { console.log(err.toString()); }
              if(res == true)
              {
                        response.setHeader('200', { 'Content-Type': 'x-application/json' });
                        response.send({result: true});
              } else {
                        response.setHeader('401', { 'Content-Type': 'x-application/json' });
                        console.log('invalid password');
                        response.send({result:false});
                     }
              });
         }
        });

return next();

而且我总是以无效密码告终。在与从数据库中提取的内容进行比较之前,我是否需要获取明文密码并重新加密?

4

16 回答 16

17

你可以跳过做bcrypt.genSalt和使用bcrypt.hash(password, 10, function(err, hash) {..});

你的比较功能对我来说似乎很好。

这对我来说很好用:

var bcrypt = require('bcrypt');

bcrypt.hash('mypassword', 10, function(err, hash) {
    if (err) { throw (err); }

    bcrypt.compare('mypassword', hash, function(err, result) {
        if (err) { throw (err); }
        console.log(result);
    });
});
于 2013-02-10T10:33:53.167 回答
8

我不知道你是否和我一样,我有同样的问题,因为我的表的长度为 45 个字符,bcrypt 比较哈希长度是否与 60 不同,它返回 false。只需增加表格中字符的长度

于 2017-01-02T18:54:48.520 回答
4

我的原因是我的数据库列没有足够大的 varchar 长度。一个检查的好地方。

于 2017-06-24T18:46:24.700 回答
3

bcrypt 的比较方法的参数应该是

bcrypt.compare(actual_password, encrypted_password)

代替

bcrypt.compare(encrypted_password, actual_password)

=> encrypted_pa​​ssword 应该是第二个参数。

于 2021-11-24T17:29:16.127 回答
2

我有同样的问题。将节点包从bcrypt更改bcryptjs为比较后,效果就像一个魅力。由于包似乎是一个fork,功能不需要调整。

于 2020-01-23T09:02:21.273 回答
2

对我来说,这只是一种争论障碍

正确的顺序

bcrypt.compare(plainPasswordToCheck, hashedPasswordOnStorage)
于 2021-01-07T08:02:44.240 回答
1

我遇到了同样的问题,但我确定我没有对密码进行两次编码。事情就是这样。bcrypt-nodejs npm 包在 v0.0.3 上,我正在使用这个版本。我正在编写算法以在注册时存储用户密码并在登录时读取用户密码。前端是一个简单的电子邮件字段输入文本和密码字段输入密码。当我提交请求时,我在本地节点服务器上发布对https://localhost ... 的调用。我可以记录收到的数据,我可以看到记录的密码与前端插入的密码相同。

用于存储密码的代码是:

//var user.bcrypt = bcrypt.genSaltSync(10);;
var clearPwd = user.password;
user.password = bcrypt.hashSync(clearPwd);//, user.bcrypt);
log4.debug("hashSyncked: "+ user.password);
db.userSave(user, cb);

用于读取和比较密码的代码是:

log4.debug('compare '+pwd+' with saved on db for user %j', userDoc.password);
var okPwd = bcrypt.compareSync(pwd, userDoc.password);

所以,我看到了散列密码,它被记录为一个字符串,如 $ert3435tF.02ri 等......

但是每次我使用注册时的相同密码登录时,okPwd总是错误的。为什么?

即使我取消注释注释代码!

更新 我找到的解决方案是关于方法的。密码不应该这样存储和读取,这太……粗鲁了!这里提到了正确的方法当心!该指南有错误。bcrypt.hash(...) 函数需要 2 个对象参数和 2 个回调!最后一个是在散列过程结束时调用的,第一个被调用来跟踪散列过程。我把它设为空,一切都很好。我承认我犯了另一个错误:我使用 bcrypt-nodejs 包而不是 brcrypt。

于 2016-09-24T08:05:23.117 回答
1

只需修改数据库中分配给密码字段的字符长度,可能生成的哈希值大于该字段可以支持的值

于 2019-01-04T20:00:09.837 回答
1

我的哈希以 $2y 开头,它必须以 $2b 开头

该库支持 $2a$ 和 $2b$ 前缀 bcrypt 哈希。$2x$ 和 $2y$ 哈希是专门为 John the Ripper 开发的 bcrypt 实现。理论上,它们应该与 $2b$ 前缀兼容。

于 2020-05-08T12:58:07.257 回答
0

这对我有用。

var bcrypt = require('bcrypt');
var salt = bcrypt.genSaltSync();

bcrypt.hash('mypassword', salt, function(err, hash){
    if(err) throw err;

    bcrypt.compare('mypassword', hash, function(err, result) {
      if (err) { throw (err); }
      console.log(result);
    });

});
于 2015-08-13T08:31:41.413 回答
0

我遇到了同样的问题,对我来说,解决方案是修复前端的错字。我正在从我的表单中发送“密码”并期待“密码”。然后 bcyppt 以某种方式对返回的未定义值进行哈希处理,这就是 compare() 总是返回 false 的原因。

希望这对某人有帮助!

于 2020-02-22T09:11:20.117 回答
0

对我有用的另一种可能的解决方案是,如果在您的用户模型中,您将其放在密码字段下。

lowercase: true,

我碰巧从另一个领域复制了这个。当我删除它时,问题就消失了。

于 2020-06-14T16:26:35.003 回答
0

我删除了我的用户并重新创建了它并这样做了

const isMatch = await bcrypt.compare(password, user.password);
console.log(user.password, isMatch);
if (!isMatch) {
  return res.status(400).json({
    msg:
      "Sorry, your password was incorrect. Please double-check your password.",
  });

在创建用户时,我这样做了

const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(password, salt);
于 2021-01-17T21:33:58.607 回答
0

在比较函数中,您不需要生成新的哈希,请执行以下操作:

async function Login(email, password) {
  const user = await this.service.getByEmail(email);

  const passwordBd = user.user_password;

  const matching = await bcrypt.compare(password, passwordBd);

  console.log(matching); //true
};
于 2021-02-09T17:46:30.837 回答
0

就我而言,我将哈希作为命令行参数传递给节点程序 - 仅用于测试:

node admin/bcrypt.js password $2b$10$/v9nAxpPQoDH5LMa/q.0AON/gEk.AxF57hHtIGkKR5IAWfMLyBcmm

哈希以$2b$10$/;开头 $2and被解释为$1位置参数并被评估为空值,因此被比较的值与我传入的值不同。$用 a 转义符号\解决了这个问题:

node admin/bcrypt.js password \$2b\$10\$/v9nAxpPQoDH5LMa/q.0AON/gEk.AxF57hHtIGkKR5IAWfMLyBcmm
于 2021-12-28T17:55:21.757 回答
-2

那是由于密码长度为 45,增加它并解决问题。

于 2022-02-10T10:59:41.873 回答