我正在尝试对某些帖子的评论使用简单的身份验证。
用户使用即时 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 来确认数据
在这一部分中,我必须解密用户输入的密码以与数据库中的加密密码进行比较
我如何解密密码,有什么好的方法可以做到这一点吗?
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 使用称为“盐”的东西,它是一个随机值,用于提高针对预先计算的哈希值的安全性。盐存储在哈希本身中。
BCrypt 定义了自己的 == 方法,该方法知道如何提取“盐”值,以便在比较密码时可以考虑到这一点。
BCrypt#== 从存储的哈希中获取“盐”值,然后使用该盐对纯文本密码(用户输入)进行哈希处理,以便在密码有效时两个哈希值将相同。
如果你查看源代码,它看起来像这样:
def ==(secret)
super(
BCrypt::Engine.hash_secret(secret, @salt)
)
end
请记住,super 将在父类上调用相同的方法(在本例中为 ==)。 BCrypt::Password 的父类是 String。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)