我正在爲我的網站安裝用戶註冊腳本(Tank Auth)。便攜式(PHPass)密碼散列。我應該使用它們嗎?
在安裝引導其說,
警告:默認情況下,庫產生不可移植強的系統特定 密碼哈希值。 這意味着一旦創建,用戶 數據庫不能轉儲和導出 到另一臺服務器。此行爲可以在配置文件中更改爲 。
這讓我陷入兩難境地。將來我可能想更換服務器,但我也不想要弱密碼。便攜式密碼是否有很大風險?更重要的是,它們是什麼意思的哈希?這是字符長度嗎?
我正在爲我的網站安裝用戶註冊腳本(Tank Auth)。便攜式(PHPass)密碼散列。我應該使用它們嗎?
在安裝引導其說,
警告:默認情況下,庫產生不可移植強的系統特定 密碼哈希值。 這意味着一旦創建,用戶 數據庫不能轉儲和導出 到另一臺服務器。此行爲可以在配置文件中更改爲 。
這讓我陷入兩難境地。將來我可能想更換服務器,但我也不想要弱密碼。便攜式密碼是否有很大風險?更重要的是,它們是什麼意思的哈希?這是字符長度嗎?
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編碼版本。
$final = '$P$'
$final .= encode64_int($rounds)
(從構造,最小值是5上PHP 5+,其他3個)
$final .= genSalt()
(鹽是6個字節在... 8個字節 「encode64」 格式)。
$hash = md5($salt . $password)
對於2
$rounds
次,做$hash = md5($hash . $password)
$final = encode64($hash)
所以最終的哈希本質上是這樣的:
$P$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0
\__________/\____________________/
\ \
\ \ Actual Hash
\
\ $P$ 9 IQRaTwmf
\_/ \ \______/
\ \ \
\ \ \ Salt
\ \
\ \ # Rounds (not decimal representation, 9 is actually 11)
\
\ Hash Header
+1真棒和圖解! – JohnP 2011-03-17 18:43:46
感謝您的領導,刪除了我的答案,所以沒有人得到錯誤的想法。 – JohnP 2011-03-17 18:50:59
輝煌的答案!謝謝!我學到的比我想象的要多。 – CyberJunkie 2011-03-17 19:00:00
這不是題外話題,而是關於PHPass以非便攜模式生成的哈希的可移植性。 – 2011-03-17 18:40:29