根據不同的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仍然會足夠聰明,以正確的方式檢查你的舊哈希。
我和你的情況一樣,在我的框架中跨多個站點使用PHPass。由於我關閉了便攜模式,因此我已將登錄腳本設置爲逐漸重新散列未在登錄時使用bcrypt的密碼。
* 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
謝謝,但鹽不會存儲在任何地方 - 根據我的理解,它會在每次散列時根據設置生成鹽分,或根據現有散列進行檢查。我知道我沒有存儲任何東西,除了產生的哈希之外,我的鹽是我自己創造的。 知道了,有沒有問題切換版本?就好像它在一臺裝有PHP 4的服務器上,並且它們升級到5.或者任何其他可能導致哈希值不一致的問題。 說起來 - 每次運行它時它是如何爲相同的密碼生成一個新的散列?那部分也讓我感到困惑。 – Jon 2011-01-25 02:22:32
@Jon你確定它沒有在散列密碼中存儲鹽嗎?是否有存儲它的輸出或部分輸出?我通常使用像我提交給Kohana的自定義方法:[補丁文件](http://dev.kohanaframework.org/attachments/1495/kohana_security_patch.patch)。唯一可能需要更改的是默認的散列方法,並且`makeSaltedHash`中的回合數量從20到500(或更高的數字)... – ircmaxell 2011-01-25 02:29:31