我如何通过 'Bcrypt' Gem 比较解密密码和加密密码

How can i compare decrypted password and encrypted password by 'Bcrypt' Gem

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

用户使用即时 ID 和密码输入评论

我使用 'bcrypt' gem 将密码存储在数据库中。

像这样 comments_controller.rb

@comment = Comment.new(comment_params)
bcrypted_pwd = BCrypt::Password.create(@comment.user_pwd)
@comment.user_pwd = bcrypted_pwd

当用户想要删除他们的评论时,我使用数据确认模式gem来确认数据

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

我怎样才能解密密码,有什么好的方法吗?

how can i decrypt password and is there any good way to done this?

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

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对象,将存储在数据库中的hash作为参数。

右边的部分(new_pass)只是用户尝试登录的纯文本密码。

让我们了解一下:

BCrypt 使用一种叫做“盐”的东西,这是一种随机值,用于提高针对预先计算的哈希值的安全性。盐存储在哈希本身中。 BCrypt 定义了自己的 == 方法,它知道如何提取“盐”值,以便在比较密码时可以考虑到这一点。

BCrypt#== 从存储的散列中获取“盐”值,然后使用该盐对纯文本密码(用户输入)进行散列,以便如果密码有效,两个散列将相同。

如果您要查看源代码,它看起来应该是这样的:

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

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