Don*_*Lee 5 ruby encryption ruby-on-rails bcrypt bcrypt-ruby
我正在尝试对一些帖子的评论使用简单的身份验证.
用户使用即时ID和密码键入注释
我用'bcrypt'gem来存储数据库中的密码.
在comments_controller.rb中是这样的
@comment = Comment.new(comment_params)
bcrypted_pwd = BCrypt::Password.create(@comment.user_pwd)
@comment.user_pwd = bcrypted_pwd
当用户想要删除他们的评论时,我使用data-confirm-modal gem来确认数据
在这部分中,我必须解密用户输入密码以与Database中的加密密码进行比较
我怎么能解密密码,有没有什么好方法可以做到这一点?
Vis*_*hal 12
ency_pass = BCrypt::Password.create("testing")
new_pass = "testing"
让我们看看我们如何比较两个bcrypt哈希,一个来自数据库,一个来自用户输入(如表格或类似的东西).
BCrypt::Password.new(ency_pass) == new_pass
# true
BCrypt::Password.new(ency_pass) == "testing2"
#false
左边的部分(BCrypt::Password.new)是一个BCrypt对象,它将存储在数据库中的哈希作为参数.
右侧的部分(new_pass)只是用户尝试登录的纯文本密码.
让我们理解这件事:
BCrypt使用称为"salt"的东西,这是一个随机值,用于提高对预先计算的哈希值的安全性.salt存储在哈希本身中.BCrypt定义了自己的==方法,该方法知道如何提取"salt"值,以便在比较密码时将其考虑在内.
BCrypt#==从存储的散列中获取"salt"值,然后使用此盐散列明文密码(用户输入),以便在密码有效时两个散列都相同.
如果您要查看源代码,它看起来像这样:
def ==(secret)
 super(
  BCrypt::Engine.hash_secret(secret, @salt)
 )
end
请记住,super将在父类上调用相同的方法(在本例中为==).BCrypt :: Password的父类是String.
| 归档时间: | 
 | 
| 查看次数: | 3730 次 | 
| 最近记录: |