Как bcrypt-ruby скрывает пароли взломанной базы данных?

Я пытаюсь понять, как работает has_secure_password. На веб-сайте есть следующие примеры того, как его использовать. Меня смущает метод password класса User. Похоже, что код @password ||= Password.new(password_hash) берет зашифрованный хеш и возвращает незашифрованный пароль. Не должно быть возможности восстановить пароль только из зашифрованного хэша. Что я неправильно понимаю в Password.new

Модель пользователя

require 'bcrypt'

class User < ActiveRecord::Base
  # users.password_hash in the database is a :string
  include BCrypt

  def password
    @password ||= Password.new(password_hash)
  end

  def password=(new_password)
    @password = Password.create(new_password)
    self.password_hash = @password
  end
end

Создание учетной записи

def create
  @user = User.new(params[:user])
  @user.password = params[:password]
  @user.save!
end

Аутентификация пользователя

def login
  @user = User.find_by_email(params[:email])
  if @user.password == params[:password]
    give_token
  else
    redirect_to home_url
  end
end

person user782220    schedule 29.03.2013    source источник


Ответы (1)


Я понял, что строка кода if @user.password == params[:password] не сравнивает зашифрованный хэш с незашифрованным паролем params[:password]. Он берет params[:password] и хэширует его перед сравнением. Хэширование params[:password] скрыто ==, которое оказывается вызовом метода.

person user782220    schedule 30.03.2013