Как plataformatec разрабатывает шифрование паролей?

#javascript #ruby-on-rails #node.js #encryption #devise

#javascript #ruby-on-rails #node.js #шифрование #разработка

Вопрос:

В этом примере пароль является abcd1234 и это то, что разработано, сохраненным в базе данных

 email: edu@example.com
encrypted_password: 9fead460b4eafc9fb4f188e4d6f24536f5849ed7
password_salt: k_c7dqyNKiQbSC_r8grH
  

Я пытаюсь создать node.js приложение, которое проверяет обычный пароль на соответствие зашифрованным данным, поэтому был бы полезен пример javascript.

Комментарии:

1. То, что у вас есть, похоже на обработанные данные того, что devise создано. encrypted_password Длина верна для хэша bcrypt, но, по-видимому, этот хэш закодирован с password_salt значением, которое не является частью devise пакета. Прямо сейчас вашей информации недостаточно для решения вашего вопроса

Ответ №1:

Приложение использовало шифровальщик sha1, и я создал эту его версию на javascript:

 function createHash (password, salt) {
  let pepper = ''
  let digest = ''
  const STRETCHES = 10
  for (let i = 0; i < STRETCHES; i  ) {
    digest = crypto
      .createHash('sha1')
      .update(`--${salt}--${digest}--${password}--${pepper}--`)
      .digest('hex')
  }
  return digest
}
  

Ответ №2:

Он использует алгоритм хэширования паролей OpenBSD bcrypt()

Вот encryptor.rb код:

 # frozen_string_literal: true

require 'bcrypt'

module Devise
  module Encryptor
    def self.digest(klass, password)
      if klass.pepper.present?
        password = "#{password}#{klass.pepper}"
      end
      ::BCrypt::Password.create(password, cost: klass.stretches).to_s
    end

    def self.compare(klass, hashed_password, password)
      return false if hashed_password.blank?
      bcrypt   = ::BCrypt::Password.new(hashed_password)
      if klass.pepper.present?
        password = "#{password}#{klass.pepper}"
      end
      password = ::BCrypt::Engine.hash_secret(password, bcrypt.salt)
      Devise.secure_compare(password, hashed_password)
    end
  end
end
  

Вы могли бы найти больше там

И вот еще о bcrypt.js

Пример из их readme:

Для проверки пароля:

 // Load hash from your password DB.
bcrypt.compareSync("B4c0//", hash); // true
bcrypt.compareSync("not_bacon", hash); // false
  

Комментарии:

1. Я пытался использовать javascript bcrypt, но он хэширует в другом формате

2. Возможны две причины: приложение plataformatec devise использует пользовательский криптограф вместо стандартного или существует второй уровень шифрования между приложением и базой данных. Кроме того, вы должны знать ключи безопасности приложения и pepper значение (по умолчанию это адрес электронной почты). Если у вас нет доступа к исходным кодам приложения devise — вы не добьетесь успеха.