【问题标题】:NODE.JS - How to check a Laravel hashed password with bcrypt?NODE.JS - 如何使用 bcrypt 检查 Laravel 散列密码?
【发布时间】:2019-06-18 20:28:29
【问题描述】:

我正在开发一个Node.js 应用程序,它需要使用来自Laravel 应用程序的相同数据库信息登录。

我读过BCrypt 并尝试使用它来比较它生成的散列密码与存储在数据库中的Laravel 密码。

所以,根据BCrypt 的文档,我需要这样做:

var salt = bcrypt.genSaltSync(saltRounds);
var hash = bcrypt.hashSync(myPlaintextPassword, salt);

但我不知道如何使用与Laravel 完全相同的盐来散列我的密码。我需要使用 APP_KEY 来执行此操作吗?

【问题讨论】:

    标签: node.js laravel hash bcrypt


    【解决方案1】:

    我喜欢答案here。这比我想象的要容易得多。

    var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2';
    var bcrypt = require('bcrypt');
    hash = hash.replace(/^\$2y(.+)$/i, '$2a$1');
    bcrypt.compare("secret", hash, function(err, res) {
        console.log(res);
    });
    

    【讨论】:

      【解决方案2】:

      据我了解,盐是作为散列的一部分存储的。

      那么为什么不将纯文本与存储的哈希值进行比较。

      尝试以下方法(来自 bcrypt 文档):

      bcrypt.compare(myPlaintextPassword, hash, function(err, res) {
          // res == true
      });
      

      hash 将是Laravel 数据库中的用户密码哈希值。

      例如:

      var pass_hash = '$2y$12$Z3Dk1YAzNsdXxq8EKNQxluqGglI6dvncfJxDj0mZHh7zceX2XoX/W'
      var pass_string = '1234'
      bcrypt.compare(pass_string, pass_hash,(err,valid)=>{
       if(valid){console.log("valid password match")}
       else{console.log("wrong credentials")}
      });
      

      【讨论】:

      • 它不起作用。 comparealways 返回“错误的凭据”。
      • 你确定你有特定哈希的有效匹配吗?
      • 是的。我已经使用 Laravel 的 Hash::make 设置了密码,并且我确定没有哈希的密码是什么。
      • 如果您在比较之前对 pass_hash 进行 console.log,它会显示数据库中的那个吗? (只是确保您没有比较错误或未定义的值)...如果您测试我的示例,对 pass_hash 和 pass_string 进行硬编码,它是否有效?