2012-04-17 78 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. 加密器是SHA1

    我一直在尋找的文件夾中唯一的 「devise.rb」 「\設置\初始化」 的加密是作爲「#config.encryptor = sha1」 但是在Ruby lib文件夾中還有一個「devise.rb」,其中「\ Ruby191 \ lib \ ruby​​ \ gems \ 1.9.1 \ gems \ devise-1.0.8」 \ lib \ devise.rb「 還有一個配置文件離子作爲 \ Ruby191 \ LIB \紅寶石\寶石\ 1.9.1 \寶石:使用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 2012-04-17 22:08:02

+0

快速瀏覽GitHub上的設計源代碼表明,除了向散列中添加salt(應該爲每個用戶更改)之外,Devise還會爲散列添加一個胡椒值(對於每個安裝而言都是相同的) ,這是從Devise配置中讀取的。所以你可能需要從配置文件中知道這個值。 (我不是Ruby程序員,對不起,如果我讀錯了......) – Jazz 2012-04-17 22:28:48

+0

最後我知道...... Devise正在使用Bcrypt ...我有一個與Coldfusion類似的問題,只是稱爲Java庫作爲目的。不知道,如果PHP可以做到這一點... – 2012-04-17 22:36:31

回答

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?

做bcrypt在PHP中默認情況下,設計使用10個延伸。

鹽看起來是加密密碼的前29個字符。你可以做(​​在rails中)User.first.authenticable_salt

胡椒粉應該在config/initializers/devise.rb中列出,但它可能會使用你的應用程序的祕密標記。

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