我如何通过 '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 是字符串。
我正在尝试对某些 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 是字符串。