我如何比较“Bcrypt”Gem 解密的密码和加密的密码

2024-02-27

我正在尝试对某些帖子的评论使用简单的身份验证。

用户使用即时 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(使用前将#替换为@)

我如何比较“Bcrypt”Gem 解密的密码和加密的密码 的相关文章

随机推荐