簡體   English   中英

在Rails中使用BCrypt進行手動身份驗證

[英]Using BCrypt in Rails to manually authenticate

我正在嘗試在我的rails應用程序中使用BCrypt來安全地保存用戶密碼。 我能夠很好地保存加密密碼,甚至可以將其與原始純文本字符串進行比較以成功進行驗證。 問題似乎是,每次我加密密碼時,我都會得到不同的輸出(我假設是由於鹽或其他原因),並且在保存到數據庫后,驗證不成立(我保存在數據庫中)。 sqlite3數據庫(如果有幫助)。

例如(在Rails控制台中):

2.1.2 :001 > u = User.new
 => #<User id: nil, created_at: nil, updated_at: nil, username: nil, password: nil> 
2.1.2 :002 > u.username = "jdoe"
 => "jdoe"
2.1.2 :002 > u.password = BCrypt::Password.create("snoopy")
 => "$2a$10$jJpHrgUmAh.YULY9CJUDjOSb9audpeD3Hx.66uVhix.WEDDB0HO.y" 
2.1.2 :003 > u.password == "snoopy"
 => true
2.1.2 :004 > u.save
 => true
u2 = User.find_by_username("jdoe")
 => [user "jdoe" is found here]
2.1.2 :006 > u2.password == "snoopy"
 => false

我知道已經有像has_secure_password這樣的現成的解決方案,但是我想手動實現,以真正了解正在發生的事情。

設置密碼時,會將其設置為BCrypt :: Password對象。 我猜想當您從數據庫中加載它時,它是作為一個簡單的字符串加載的,因此==不會使用原始鹽加密給定的字符串。

請嘗試以下操作:

(...)
u.save
u2 = User.find_by_username("jdoe")
BCrypt::Password.new(u2.password) == "snoopy"

編輯

看來Rails提供了after_find回調,所以如果您定義這樣的話

class User < ActiveRecord::Base
  after_find do |user|
    user.password = BCrypt::Password.new(user.password)
  end
end

它應該按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM