NODE.JS - 如何使用bcrypt检查Laravel哈希密码?

5
我正在开发一个使用相同数据库信息从 Laravel 应用程序登录的 Node.js 应用程序。
我已经阅读了关于 BCrypt 的相关资料,并尝试使用它来比较生成的哈希密码与存储在数据库中的 Laravel 密码。
因此,根据 BCrypt 的文档,我需要做类似以下的事情:
var salt = bcrypt.genSaltSync(saltRounds);
var hash = bcrypt.hashSync(myPlaintextPassword, salt);

但我不知道如何使用与 Laravel 相同的盐值来哈希我的密码。我需要使用 APP_KEY 吗?

2个回答

19

我在这里找到了答案。比我想象的要容易得多。

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

1
谢谢你解决了一个问题,回来分享它! - Regular Jo

2
据我理解,盐值是作为哈希的一部分存储的。
因此,为什么不将明文与存储的哈希值进行比较呢?
可以尝试以下方法(来自bcrypt文档): bcrypt.compareSync(plainPassword, hash); 其中,plainPassword为明文密码,hash为已存储的哈希值。
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")}
});

它不起作用。compare总是返回“凭据错误”。 - Bruno Albuquerque
你确定你有特定哈希的有效匹配吗? - EMX
是的。我已经使用Laravel中的Hash::make生成了密码,并且我确定未经哈希处理的密码是什么。 - Bruno Albuquerque
如果在比较之前使用console.log输出pass_hash,它是否显示来自数据库的值?(只是确保您没有比较错误或未定义的值)... 如果您测试我的示例,硬编码pass_hash和pass_string,它是否有效? - EMX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接