Как я могу сравнить зашифрованный пароль и зашифрованный пароль 'осуществляется' Гем


Я пытаюсь использовать простую аутентификацию для комментариев к некоторым постам.

Пользователи вводят комментарий с мгновенным идентификатором и паролем

И я использую '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 для подтверждения данных, когда пользователь хочет удалить свои комментарии

В этой части я должен расшифровать пароль ввода пользователя для сравнения с зашифрованным паролем в базе данных

Как я могу расшифровать пароль и есть ли какой-нибудь хороший способ сделать это?

2 2

2 ответа:

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 использует то, что называется a "соль" -это случайное значение, используемое для повышения безопасности от предварительно вычисленных хэшей. Соль хранится в самом гашише. BCrypt определяет свой собственный метод==, который знает, как извлечь это значение "соли", чтобы он мог принять это во внимание при сравнении паролей.

BCrypt#= = берет значение "salt" из сохраненного хэша, затем он хэширует простой текстовый пароль (ввод пользователя), используя эту соль, так что оба хэша будут идентичны, если пароль действителен.

Если бы Вы были если посмотреть на исходный код, то он будет выглядеть примерно так:

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

Помните, что super вызовет тот же метод (в данном случае ==) для родительского класса. Родительский класс осуществляется::пароль строку.

Как я могу расшифровать пароль и есть ли хороший способ сделать это?

Вы можете расшифровать только то, что зашифровано. Bcrypt - это не алгоритм шифрования, а алгоритм хэширования. Вы не можете отменить хэш. Это доказуемо невозможно. (И доказательство даже не трудно, его может понять старшеклассник.)