繁体   English   中英

在 Javascript 中重建/验证 Ruby on Rails Bcrypt 密码哈希

[英]Rebuild/Verify Ruby on Rails Bcrypt password hash in Javascript

我必须从 Ruby on Rails 重建一个项目到 Node.js。 Bcrypt 用于在 Ruby 项目中散列密码,我正在尝试重建相同的散列,以便我可以复制散列密码,并且用户可以在节点版本上使用相同的凭据登录。

此哈希$2a$11$j2IA8cPRFFC4YOXTl5kb9eF02fwNdLyFAPOvflQ3h/QdX8mE1SNK2用于密码Test1234 我检查了 Ruby on Rails 代码,看到了以下函数来散列密码

基本信息

COST = 11
SALT = 1234567890

创建哈希

def password_hash(password)
  pwd = "#{password}#{SALT}"
  ::BCrypt::Password.create(pwd, cost: COST)
end

密码是否匹配?

def password_match?(password = nil)
  password ||= @params[:password]
  encrypted_password = get_encrypted_password
  return false if !encrypted_password || encrypted_password.size < 8

  pwd = "#{password}#{SALT}"
  BCrypt::Password.new(encrypted_password) == pwd
end

def get_encrypted_password
  return unless @account

  @account.encrypted_password
end

据我所知,这意味着在password_match函数中,pwd 将是Test12341234567890BCrypt::Password.new($2a$11$j2IA8cPRFFC4YOXTl5kb9eF02fwNdLyFAPOvflQ3h/QdX8mE1SNK2)检查Test12341234567890 (pwd)是否匹配哈希。

当我使用像https://bcrypt.online/这样的在线 Bcrypt 验证器并输入哈希值和 pwd 值时,我没有得到匹配。

我还尝试使用 Javascript 包中的bcrypt.compare方法,但这也不起作用。

我错过了什么?

所以我们做了一个oopsie并在评论中解决了这个问题。 这是一个作为答案的回顾。

我:

我用“Test1234”和你提供的盐尝试了你的密码哈希函数。 结果得到了 $2a$11$bhdYASCaEPv/0HXv3OFtIupv8CgHFoEWkMonShKnNN1fkmRIg.07S,通过您链接的在线验证程序运行它并得到“提供的哈希与提供的纯文本匹配”。

BCrypt::Password.new(password_hash("Test1234")) == "Test12341234567890" 也可以正常工作并返回true。

还尝试了 Node.js 和 bcryptjs 并做了 bcrypt.compareSync('Test12341234567890', "$2a$11$bhdYASCaEPv/0HXv3OFtIupv8CgHFoEWkMonShKnNN1fkmRIg.07S")。 也可以正常工作并返回true。

托雷:

是的,这是您使用相同方法创建的新哈希。 但由于某种原因,当前存储在数据库中的密码 Test1234 的已创建哈希 $2a$11$j2IA8cPRFFC4YOXTl5kb9eF02fwNdLyFAPOvflQ3h/QdX8mE1SNK2 未通过在线验证测试和 node.js 中的 compareSync 测试

我:

这应该让您知道问题不在于 Ruby 的哈希创建函数,也不在于节点的哈希测试函数,而是其他地方(技术上超出了这个问题的范围)。 也许您的数据库由于某种原因没有存储完整的哈希,或者以错误的方式存储它。 也许某处的某些东西会剥离或转义散列中的某些字符,从而使您得到不完整的字符。 也许前面提到的一些事情发生在盐上。 也许数据库中的散列是由不同的或更旧的散列函数生成的。 也许盐变了。

托雷:

感谢您的评论! 根据您的评论,我发现他们使用的盐与 .env 文件中的盐不同。 它存储在 Heroku 的配置变量中。 现在一切正常!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM