[英]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 將是Test12341234567890
和BCrypt::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.