2011-03-17 158 views
21

我正在爲我的網站安裝用戶註冊腳本(Tank Auth)。便攜式(PHPass)密碼散列。我應該使用它們嗎?

在安裝引導其說,

警告:默認情況下,庫產生不可移植強的系統特定 密碼哈希值。 這意味着一旦創建,用戶 數據庫不能轉儲和導出 到另一臺服務器。此行爲可以在配置文件中更改爲 。

這讓我陷入兩難境地。將來我可能想更換服務器,但我也不想要弱密碼。便攜式密碼是否有很大風險?更重要的是,它們是什麼意思的哈希?這是字符長度嗎?

+4

這不是題外話題,而是關於PHPass以非便攜模式生成的哈希的可移植性。 – 2011-03-17 18:40:29

回答

92

Task Auth uses PHPass for password hashing(舊版本,這不是一個好的跡象;你可能想要在你的安裝中update that)。 PHPass有兩種模式,便攜式和bcrypt。

根據PHP版本,您不需要進行可移植哈希。在PHP 5.3及以上版本中,如果PHP在系統上不可用,PHP提供自己的bcrypt實現。 如果你所有的服務器都有PHP 5.3及以上版本,我強烈建議關閉便攜式哈希。 PHPass「portables hashes」存在,因爲根據安裝的PHP版本,bcrypt可能不可用。

也就是說,PHPass便攜式哈希不會將鹽存儲在其哈希中。這就是爲什麼每次運行相同的密碼是不同的。

此外,PHPass這些哈希*檢查是否可用該版本的md5()功能支持$rawMode參數的生成過程中使用PHP_VERSION。如果沒有,則使用pack()將十六進制數據轉換爲二進制數據(注意,這比使用$rawMode簡單,因此這是分支製作的原因要慢得多)。

再說一次,如果你所有的服務器運行的是PHP 5.3及以上版本,我強烈建議關閉便攜模式,並讓PHPass使用bcrypt。由於PHP 5.3+在系統不可用時提供了自己的實現,因此您的散列可以跨操作系統進行檢查。即使你關閉了便攜模式,PHPass仍然會足夠聰明,以正確的方式檢查你的舊哈希。

* 131線


編輯:更多解釋,這裏是在便攜方式哈希值是如何產生的(簡化,並沒有使用PHPass發現實際變量,但準確)。請注意,PHPass使用他們自己的base64編碼版本。

  1. $final = '$P$'

  2. $final .= encode64_int($rounds)(從構造,最小值是5上PHP 5+,其他3個)

  3. $final .= genSalt()(鹽是6個字節在... 8個字節 「encode64」 格式)。

  4. $hash = md5($salt . $password)

  5. 對於2$rounds次,做$hash = md5($hash . $password)

  6. $final = encode64($hash)

所以最終的哈希本質上是這樣的:

$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0 
\__________/\____________________/ 
    \     \ 
    \     \ Actual Hash 
    \ 
    \ $P$ 9 IQRaTwmf 
     \_/ \ \______/ 
     \  \  \ 
      \  \  \ Salt 
      \  \ 
      \  \ # Rounds (not decimal representation, 9 is actually 11) 
      \ 
       \ Hash Header 
+13

+1真棒和圖解! – JohnP 2011-03-17 18:43:46

+1

感謝您的領導,刪除了我的答案,所以沒有人得到錯誤的想法。 – JohnP 2011-03-17 18:50:59

+1

輝煌的答案!謝謝!我學到的比我想象的要多。 – CyberJunkie 2011-03-17 19:00:00