【问题标题】:How to generate the password in PHP as it did by Devise Gem in Ruby on Rails如何在 PHP 中生成密码,就像 Devise Gem 在 Ruby on Rails 中所做的那样
【发布时间】:2012-04-29 07:16:21
【问题描述】:

我正在将一个网站从 Ruby on Rails 更新为 PHP。 我需要在 Ruby on Rails 中生成 Devise Gem 生成的密码。 我必须知道密码的散列方法是什么,才能使用 PHP 创建相同的方法。 但是对于初学者来说,在 Ruby on Rails 中找到这些代码并不容易。 如果有人知道我应该在哪里找到它,请帮助我。

这两个都是我找到的:

1) The configuration of encryptor is disabled in devise.rb like below:
  # config.encryptor = :sha1
2) I read the comments very carefully then I found that they using sha512 and bcrypt as default encryptor.
  # (default), :sha512 and :bcrypt. Devise also supports encryptors from others

我尝试使用 PHP 以不同方式制作相同的加密密码:

1) sha1('--'.$password_salt.'--'.$encrypted_password);
2) sha1($password_salt.'-----'.$encrypted_password);
3) sha1('--'.$password_salt.'--'.$encrypted_password.'--');
4) sha1($password_salt.$encrypted_password);
5) sha1($encrypted_password.$password_salt);
6) substr(hash('sha512', $password_salt.$encrypted_password, false), 20);
7) substr(hash('sha512', $encrypted_password.$password_salt, false), 0, 40);
8) hash('sha512', $encrypted_password.$password_salt, false);
9) hash('sha512', $password_salt.$encrypted_password, false);
10) substr(hash('sha512', '--'.$password_salt.'--'.$encrypted_password.'--', false), 0, 40);

我无法从以上任何一个中得到相同的结果。 有谁能告诉我Devise Gem的加密方法吗?

帮帮我!!!

ps。我不擅长英语。即使我的英语不正确,请不要生气。


我在回答自己:

  1. 加密器是 Sha1

    我只在文件夹“\config\initializers”中查看“devise.rb” 加密器被命名为“# config.encryptor = :sha1” 但是在 Ruby lib 文件夹中还有一个“devise.rb”, "\Ruby191\lib\ruby\gems\1.9.1\gems\devise-1.0.8\lib\devise.rb" 还有一个配置为“@@encryptor = :sha1”

  2. 使用 Sha1 的加密方法 当您转到下面的文件时,您将看到算法代码: \Ruby191\lib\ruby\gems\1.9.1\gems\devise-1.0.8\lib\devise\encryptors\sha1.rb

    需要“digest/sha1”

    模块设计 模块加密器 # = 沙1 # 使用 Sha1 哈希算法对密码进行加密。 类 Sha1

            # Gererates a default password digest based on stretches, salt, pepper and the
            # incoming password.
            def self.digest(password, stretches, salt, pepper)
                digest = pepper
                stretches.times { digest = self.secure_digest(salt, digest, password, pepper) }
                digest
            end
    
            private
    
            # Generate a SHA1 digest joining args. Generated token is something like
            #     --arg1--arg2--arg3--argN--
            def self.secure_digest(*tokens)
                ::Digest::SHA1.hexdigest('--' << tokens.flatten.join('--') << '--')
            end
    
        end
    end
    

    结束

所以我翻译成PHP

function encrypt_password($salt, $password) {
    $pepper = '';
    $digest = $pepper;
    $stretches = 10;

    for ($i=0; $i<$stretches; $i++) {
        $join = '--'.$salt.'--'.$digest.'--'.$password.'--'.$pepper.'--';
        $digest = Sha1($join);
    }
    $result = substr($digest, 0, 40);
    return $result;
}

效果很好:-)

【问题讨论】:

  • 您能否给我一个密码/设计加密密码对以用于测试目的?我目前正在阅读设计资源以获得正确答案,我想测试一下。
  • 快速浏览 GitHub 上的 Devise 源代码表明,除了向哈希添加盐(应该为每个用户更改)之外,Devise 还添加了一个胡椒值(这是相同的对于每个安装)到从设计配置中读取的哈希值。因此,您可能需要从配置文件中知道该值。 (我不是 Ruby 程序员,如果我读错了,请见谅......)
  • 最后我知道... Devise 使用的是 Bcrypt... 我在 Coldfusion 中遇到了类似的问题,只是将 Java 库称为对象。不知道 PHP 能不能做到这一点……

标签: php ruby-on-rails encryption devise


【解决方案1】:

设计代码如下:

 def self.digest(password, stretches, salt, pepper)
   ::BCrypt::Engine.hash_secret("#{password}#{pepper}",salt, stretches)
 end

你可以在How do you use bcrypt for hashing passwords in PHP?看到如何在PHP中做bcrypt

默认情况下,Devise 使用 10 次拉伸。

盐看起来是加密密码的前 29 个字符。你可以(在 Rails 中)User.first.authenticable_salt

辣椒应该列在config/initializers/devise.rb,但它可能会使用你的应用程序秘密令牌。

请看https://github.com/plataformatec/devise/blob/master/lib/devise/models/encryptable.rb

【讨论】:

    【解决方案2】:

    根据 Devise Gem 来源,该方法有点复杂。 SHA512 部分看起来像这样:

    function sha512_digest($password, $stretches, $salt, $pepper)
    {
        $digest = $pepper;
        for ($i = 0; $i < $stretches; $i++)
        {
            $digest = hash('sha512', '--' . $salt . '--' . $digest . '--' . $password . '--' . $pepper . '--');
        }
    }
    

    BCrypt 部分对我来说有点不清楚,到目前为止我唯一想到的是它是 Blowfish 加密。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多