Как plataformatec разрабатывает шифрованные пароли? - PullRequest
0 голосов
/ 06 апреля 2019

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

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

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

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Приложение использовало sha1 encryptor , и я сделал его версию 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
}
0 голосов
/ 06 апреля 2019

Используется алгоритм хеширования пароля 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
...