Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 节点bcrypt';s compare总是返回false_Javascript_Node.js_Bcrypt - Fatal编程技术网

Javascript 节点bcrypt';s compare总是返回false

Javascript 节点bcrypt';s compare总是返回false,javascript,node.js,bcrypt,Javascript,Node.js,Bcrypt,我在尝试使用node将我的密码与bcrypt进行成功比较时遇到了麻烦。也许我遗漏了什么,但在创建帐户时,我在注册方法中执行了以下操作(一些代码缩写): 这一切都很好。我的数据库有加密密码。但当用户登录时,我无法从bcrypt获得成功的结果。比较: db.query(get account code, function(error, rows, fields) { if(rows.length == 1) { bcrypt.compare(request.p

我在尝试使用node将我的密码与bcrypt进行成功比较时遇到了麻烦。也许我遗漏了什么,但在创建帐户时,我在注册方法中执行了以下操作(一些代码缩写):

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

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();

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

您可以跳过执行
bcrypt.genSalt
并使用
bcrypt.hash(密码,10,函数(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);
    });
});
这对我有用

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);
    });

});

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

用于存储密码的代码为:

//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总是错误的。为什么?

即使我取消对已注释代码的注释

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

我不知道您是否有与我相同的问题,因为我的表的长度为45个字符,我使用bcrypt比较,如果哈希长度与60不同,则返回false。只需增加表中字符的长度

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

只需修改数据库“分配给密码”字段中的字符长度,可能生成的哈希值比该字段所能支持的更大。

我也遇到了同样的问题。将节点包从
bcrypt
更改为
bcryptjs
后,比较工作非常顺利。由于包似乎是一个fork,因此不需要调整函数。

我也遇到了同样的问题,对我来说,解决方案是修复前端的一个输入错误。我正在从我的表单中发送“pasword”,希望收到“password”。不知何故,bcyppt然后对返回的未定义值进行散列,这就是compare()始终返回false的原因


希望这对别人有帮助

我的散列从2美元开始,必须从20亿美元开始

该库支持$2a$和$2b$前缀bcrypt哈希$2x美元和 $2y$哈希特定于为John开发的bcrypt实现 开膛手。理论上,它们应该与20亿美元前缀兼容


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

lowercase: true,

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

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

正确的顺序

bcrypt.compare(plainPasswordToCheck, hashedPasswordOnStorage)

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

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);

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

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
};

谢谢你的重构。我意识到我的散列被数据库中的列大小截断了。它现在正常工作了Hi,只是想知道,如果我们使用的是异步函数,它们是否必须像您的示例中那样处于循环中,或者您可以将散列和比较分为两种方法。我有同样的问题,我想知道如果将
散列
设置为字符串,是否会导致问题?出于某种原因,我总是从
bcrypt.compare
中得到
false
,一个简单的
=
以及库中的函数
缓冲区等常数时间
给出了
true
(这是正确的),在这里放弃了
bcrypt
。将10作为.hash()的第二个参数会在运行时出错。问题是关于bcrypt.compare.Hello,欢迎来到StackOverflow!你读过吗。这应该可以帮助你避免被否决。对我来说,这个问题是因为数据库中的密码出现了换行。
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
};