6

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

用户使用即时 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 来确认数据

在这部分中,我必须解密用户输入的密码以与数据库中的加密密码进行比较

我怎样才能解密密码,有什么好的方法可以做到这一点?

4

2 回答 2

16
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#== 从存储的哈希中获取“salt”值,然后使用该 salt 对纯文本密码(用户输入)进行哈希处理,这样如果密码有效,两个哈希值将相同。

如果您要查看源代码,它看起来像这样:

def ==(secret)
 super(
  BCrypt::Engine.hash_secret(secret, @salt)
 )
end

请记住,super 将在父类上调用相同的方法(在本例中为 ==)。BCrypt::Password 的父类是 String。

于 2017-06-27T11:06:11.007 回答
-1

我怎样才能解密密码,有什么好的方法可以做到这一点?

你不能。您只能解密已加密的内容。Bcrypt 不是加密算法,它是哈希算法。您无法反转哈希。可证明是不可能的。(而且证明也不难,高中生都能看懂。)

于 2017-06-27T10:46:59.743 回答