【问题标题】:How does plataformatec devise encrypt passwords?plataformatec 如何设计加密密码?
【发布时间】:2019-04-06 01:24:21
【问题描述】:

在本例中,密码为abcd1234,这是devise 存储在数据库中的密码

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

我正在尝试构建一个 node.js 应用程序,该应用程序会根据加密数据检查纯密码,因此欢迎提供 javascript 示例。

【问题讨论】:

  • 您所拥有的看起来像是 devise 创建的经过处理的数据。 encrypted_password 长度对于 bcrypt 哈希是正确的,但显然这个哈希是用 password_salt 值编码的,它不是 devise 包的一部分。目前您的信息不足以解决您的问题

标签: javascript ruby-on-rails node.js encryption devise


【解决方案1】:

应用程序使用的是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
}

【讨论】:

    【解决方案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
    

    你可以找到更多there

    这里有更多关于bcrypt.js

    他们自述文件中的示例:

    检查密码:

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

    【讨论】:

    • 我尝试使用 javascript bcrypt 但它以不同的格式散列
    • 有两种可能的原因:plataformatec 设计应用程序使用自定义密码器而不是默认密码器,或者应用程序和数据库之间存在第二层加密。此外,您应该知道应用程序的安全密钥和pepper 值(默认为电子邮件地址)。如果您无权访问设计应用程序源 - 您将不会成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多