如何在PHP中生成密码,就像Ruby on Rails中的Devise Gem一样

时间:2012-04-17 22:04:49

标签: php ruby-on-rails encryption devise

我正在将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

    我只是在寻找" devise.rb"在文件夹" \ config \ initializers" 加密器被命名为" #config.encryptor =:sha1" 但还有一个" devise.rb"在Ruby lib文件夹中, " \ Ruby191 \ lib中\红宝石\宝石\ 1.9.1 \宝石\设计-1.0.8 \ lib中\ devise.rb" 还有一个配置为" @@ encryptor =:sha1"

  2. 使用Sha1的加密方法 当你转到下面的文件时,你会看到算法的代码: \ Ruby191 \ lib中\红宝石\宝石\ 1.9.1 \宝石\设计-1.0.8 \ lib中\色器件\加密器\ sha1.rb

    要求"摘要/ sha1"

    模块设计     模块加密器         #= Sha1         #使用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
    

  3. 所以我翻译成了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;
    }
    

    它运作良好: - )

2 个答案:

答案 0 :(得分: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个延伸。

salt看起来是加密密码的前29个字符。你可以(在轨道上)User.first.authenticable_salt

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

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

答案 1 :(得分:0)

根据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加密。