2012-04-17 7 views
6

Ruby on RailsからPHPにウェブサイトを更新しています。 Ruby on RailsでDevise Gemによって生成されたパスワードを生成する必要があります。 私はPHPで同じメソッドを作成するためのパスワードのハッシング方法が何であるか知っていなければなりません。 しかしRuby on Railsのコードを初心者として見つけるのは容易ではありません。 誰かがどこでそれを見つけるためにチェックすべきか知っていれば、私を助けてください。Ruby on RailsのDevise Gemと同じようにPHPでパスワードを生成するには

これら二つは、私が見つけたもの全てです:

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. EncryptorははSHA1

    である私が暗号だった "\ CONFIG \初期化子" フォルダにのみ "devise.rb" を探していました"#config.encryptor =:sha1"とコミットされました しかし、Rubyのlibフォルダの中にもう1つの "devise.rb"があります。 "\ Ruby191 \ lib \ ruby​​ \ gems \ 1.9.1 \ gems \ devise-1.0.8 \ lib \ devise.rb " もう1つの構成がありますイオン1.9.1 \宝石\ \ Ruby191 \ libに\ルビー\宝石:あなたが以下のファイルに行くときSHA1 を使用して、「@@暗号= SHA1」

  2. 暗号化方式は、アルゴリズムのためのコードが表示されます\考案-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 
    

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

    に翻訳終了

それは工夫宝石筋によると

+1

あなたが考案暗号化パスワードのペアをテスト目的のために/私にパスワードを与えることができる参照してください?私は現在、正解のための逸話のソースを読んでいます。私はテストしたいです。 – GergelyPolonkai

+0

GitHubのDeviseソースコードを見てみると、各ユーザーに合わせて変更する必要がある塩をハッシュに追加することに加えて、Deviseはハッシュにペッパー値(インストールごとに同じ)を追加することを提案していますこれはDevise構成から読み取られます。だから、あなたはconfigファイルからその値を知る必要があるでしょう。 (私はRubyプログラマーではないので、間違って読んでいれば申し訳ありません...) – Jazz

+0

最後に私は知っていました... DeviseはBcryptを使っていました...私はColdfusionと同様の問題がありました。オブジェクト。 PHPがそれを行うことができたらDunno ... –

答えて

0

:-)非常によく働いて、この方法はもう少し複雑です。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の暗号化だということです。

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のを行うにはどのように見ることができ、工夫が10のストレッチを使用しています。

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

唐辛子はconfig/initializers/devise.rbに記載する必要がありますが、あなたのアプリケーションの秘密のトークンを使用することがあります。

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