2013-06-20 24 views
9

閱讀有關新password_hash功能PHP 5.5的文檔默認的算法,我想知道,什麼是默認算法:什麼是password_hash

password_hash("rasmuslerdorf", PASSWORD_DEFAULT); 

關於它的文檔沒有說明這一點:http://www.php.net/manual/en/password.constants.php

+1

看起來像一些內部散列。 – DevZer0

+0

查看http://us2.php.net/password_hash的文檔,它看起來像BCrypt。他們在輸入中引用它,輸出類似於BCrypt輸出,但我不能肯定地說。 –

+0

當新的PHP版本支持更新,更強大的哈希算法時,這可能會發生變化。 – hjpotter92

回答

8

這已在password_hash()的文檔中更新,並將在常量頁面中很快更新(我剛剛在大約一個小時前提交了文檔更改)。

這將是今天生活在password.constants

從更新常數頁面(這還沒有去現場還,但將在今天晚些時候):

可用算法:

  • PASSWORD_BCRYPT (integer)

    PASSWORD_BCRYPT用於c使用CRYPT_BLOWFISH算法重新設置新密碼哈希。

    這將始終導致使用「$ 2y $」隱式格式的哈希值,該格式始終爲60個字符寬。

    支持的選項:

    • 鹽 - 手動提供鹽散列的口令時使用。請注意,這將覆蓋並防止鹽自動生成。

      如果省略,每個密碼散列都會通過password_hash()生成隨機salt。這是預定的操作模式。

    • 成本 - 它表示應該使用的算法成本。這些值的例子可以在crypt()頁面找到。

      如果省略,則使用默認值10。這是一個很好的基準成本,但您可能需要考慮根據您的硬件來增加它。

  • PASSWORD_DEFAULT (integer)

    默認算法使用如果沒有提供算法散列。當新的PHP版本支持更新,更強大的哈希算法時,這可能會發生變化。

    值得注意的是,隨着時間的推移,這個常數可能(也可能會)改變。因此你應該知道結果散列的長度可以改變。因此,如果您使用PASSWORD_DEFAULT,則應以可存儲超過60個字符(255是建議寬度)的方式存儲結果散列。

    值這個常數:

    • PHP 5.5.0 - PASSWORD_BCRYPT

至於何時以及如何PASSWORD_DEFAULT將被更新,這是在password_hash() documentation page

注:更新支持的算法通過此功能(或更改默認的)必須遵循以下規則:

  • 任何新的算法必須在覈心至少1 PHP的充分釋放成爲前默認。因此,例如,如果在5.5.5中添加了新算法,那麼直到5.7(因爲5.6將是第一個完整版本)纔會有資格進行缺省設置。但是如果在5.6.0中添加了不同的算法,它也有資格在5.7.0處默認。

  • 默認值只能在完整版本(5.6.0,6.0.0等)上更改,而不能在修訂版本上更改。唯一的例外是在當前默認情況下發現嚴重安全缺陷時的緊急情況。

+0

更新文件確認!呵呵:)我可以問你是否是PHP開發團隊的成員?或者你怎麼知道這一點? – hek2mgl

+0

@ hek2mgl:是的,我是。 [這個特別的功能](https://wiki.php.net/rfc/password_hash)是我的建議和實施。所以我有部分責任來幫助保持文檔更新(並幫助其他人使用新功能);-) – ircmaxell

9

我看了一下PHP源代碼。它默認使用PHP5.5中的bcrypt。

ext/standard/php_password.h line 31

#define PHP_PASSWORD_DEFAULT PHP_PASSWORD_BCRYPT 
+0

是的就是這樣!只是'wget'的來源和'rgrep' ...試試這個閉源! ;) – hek2mgl

+3

或者使用[lxr](http://lxr.php.net),你也可以看到[this](http://blog.ircmaxell.com/2012/03/phps-source-code-for- php-developers.html)來理解PHP的源代碼。 – Paul

2

文檔其實是相當具體的,如果有點措辭不當;散列是PHP認爲當時可用的最強大的散列,並隨時可能發生變化。由password_hash生成的哈希在開始時包含一些數據,指示最初用於生成它們的數據,允許在新的哈希算法可用時自動進行升級,而不會破壞已存儲在數據庫中的哈希。

由於bcrypt是目前定義的唯一算法,您可以假設它是默認值,但快速驗證的方法是製作一個簡單的PHP腳本,它將兩次散列相同的字符串,每個選項散列一次,固定鹽,並打印所產生的散列;他們可能會匹配。

原來的password_hash規範也可能有一些幫助。 https://wiki.php.net/rfc/password_hash