2017-06-14 90 views
1

我已經在現有問題中尋找答案,但在Rails中找不到任何涵蓋此散列方案的內容。Rails中的特定md5散列方案

我目前正在將一個PHP項目遷移到Ruby-on-Rails,我仍在學習。我正在努力移植MD5(我知道,這只是暫時的...)散列方案用於散列用戶密碼。我有普通的MD5工作,但無法找到我需要的散列方案的正確語法。

在PHP項目的散列方案的機制是:

創建密碼的MD5哈希值。 創建鹽的MD5哈希。 用salt_hash連接password_hash。 創建concatenated_string的MD5哈希。 比較stored_hash到concatenated_string

的PHP的哈希創作是:

function fn_generate_salted_password($password, $salt) 
{ 
    $_pass = ''; 

    if (empty($salt)) { 
     $_pass = md5($password); 
    } else { 
     $_pass = md5(md5($password) . md5($salt)); 
    } 

    return $_pass; 
} 

的(可憐)嘗試我對Rails中本節迄今:

Spree::User.class_eval do 
    def valid_password?(password) 
    if self.salt.present 
     if ::Digest::MD5.hexdigest((::Digest::MD5.hexdigest(password)).(::Digest::MD5.hexdigest(salt))) == self.stored_hash 
     *# Do some stuff* 
     else 
     false 
     end 
    end 
    end 
end 

任何想法?

+1

一件事攜手邁向是儘可能快地殺死MD5密碼。請記住,當有人登錄並驗證其密碼正確時,您有機會使用相同的散列(例如bcrypt)版本更新其用戶記錄,無需騷擾用戶更改其密碼。 – tadman

+0

爲了幫助解決問題的人們,可以舉例說明如何保存「測試」或「示例」等密碼,以便其他人可以驗證您的代碼是否正常工作? – tadman

+0

謝謝,這個想法是,一旦他們通過身份驗證並登錄後,MD5哈希將從數據庫中刪除,密碼將在bcrypt中進行散列處理等。 我將檢查最終哈希結果是「測試」還是「例如「在PHP應用程序中,並儘快用答案更新這個問題。 只需要添加一下,我需要在這裏定位的「鹽」在legacy_salt的數據庫中有一個字段名稱,而不是「salt」。我需要在某個地方定義它,因爲它不是MD5摘要使用的默認「salt」嗎? – bearmettle

回答

1

我會做這樣的事情:

def valid_password?(password) 
    secret = if salt.present? 
      [password, salt].map { |part| ::Digest::MD5.hexdigest(part) }.join 
      else 
      password 
      end 

stored_hash == ::Digest::MD5.hexdigest(secret) 
end 
+0

這可以擴展爲識別新的格式散列,如'「$ 2a $ 10 $ ....」'並且使用Bcrypt處理它。 – tadman