6

Ruby on Rails から PHP に Web サイトをリニューアルしています。Ruby on Rails で Devise Gem によって生成されるパスワードを生成する必要があります。PHPで同じメソッドを作成するには、パスワードのハッシュ方法が何であるかを知る必要があります。しかし、初心者が Ruby on Rails 内のコードを見つけるのは簡単ではありません。誰かがそれを見つけるためにどこをチェックすればよいか知っているなら、私を助けてください.

これら2つはすべて私が見つけたものです:

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

    「ダイジェスト/sha1」が必要

    module Devise module Encryptors # = 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
    

    終わり

だから私は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;
}

それは非常にうまく機能しています:-)

4

2 に答える 2

1

デバイスコードは次のようになります。

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

PHPでbcryptを実行する方法については、PHPでパスワードをハッシュするためにbcryptをどのように使用しますか?を参照してください。

デフォルトでは、Deviseは10ストレッチを使用します。

ソルトは、暗号化されたパスワードの最初の29文字のように見えます。あなたは(レールで)行うことができますUser.first.authenticable_salt

コショウはにリストされているはずですがconfig/initializers/devise.rb、アプリケーションのシークレットトークンを使用している可能性があります。

https://github.com/plataformatec/devise/blob/master/lib/devise/models/encryptable.rbを参照してください

于 2012-04-20T12:16:50.573 に答える
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 暗号化であるということだけです。

于 2012-04-17T22:34:08.810 に答える