我正在尝试在我的 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,但我想手动实现它以真正了解发生了什么。