2012-11-25 66 views
4

我剛剛開始學習PHP,並且想創建一個網站,其中包含我的最後一年大學項目的登錄信息。我讀過,河豚是對於一些喜歡這裏的地方散列的最好方法:openssl_digest vs hash vs hash_hmac? Difference between SALT & HMAC?如何使用blowfish自動生成加密方法的鹽

無論我讀到地穴方法包括像$2y$07$usesomesillystringforsalt$一串我的主要問題是:我怎麼隨機產生的?我讀過時間戳和mt_rand()不安全的地方。

另外我也聽說過AES是最近的首選技術,但從我可以看到它在PHP中實現似乎相當棘手!河豚仍然是確保存儲密碼的可接受方法嗎?

+2

它不會隨機產生它的'$ algo $ cost $ salt $',其中salt是完全安全的,可以使用與您的域名sha1'nd'substr(salt,0,21)貼在一起的microtime,然後21個字符被丟棄。也許我早期提出的一些內容會讓你感興趣[php-pdo-secure-login-script-example](https://code.google.com/p/php-pdo-secure-login-script-example/source/browse/分支/ index.php) –

回答

6

鹽應該是唯一(對於每個密碼)和不可預知。這兩個標準有點難以用確定性計算機實現,所以最好的辦法是使用操作系統的隨機源生成鹽。

時間戳以及mt_rand()函數並不理想,因爲可以說它們是可預測的。至少一個攻擊者可以縮小(並因此預先計算)一段時間內可能的組合。雖然這在實踐中可能沒有很大的影響,但爲什麼不盡力做到最好?

從PHP 5.3開始,您可以安全地使用mcrypt_create_iv()函數從隨機源中讀取數據,然後您必須將二進制字符串編碼爲允許的字母表。這是一個possible implementation

PHP 5.5將自己的功能password_hash()password_verify()準備就緒,以簡化這項任務。還有一個用於PHP 5.3/5.4的compatibility pack,可在password_compat下載。

3

河豚仍然可以接受,並且優於快速哈希方法。

鹽的一點是爲了防止預先計算的表攻擊。只要你有一個非平凡的鹽,就像microtime一樣,你已經阻止了任何預先計算好的沒有使用精確鹽的表。

+0

所以''密碼= crypt($ _ POST [passward],'$ 2y $ 07 $'。microtime());'行嗎?感謝您的幫助 – Connel

+0

@Connel如果語法正確,是的。 –

3

對於PHP版本5.3.7或更高版本我相信這是最好的:

$blowfish_salt = "$2y$10$".bin2hex(openssl_random_pseudo_bytes(22)); 

對於PHP版本5.5或只使用新的password_hash()function自動生成鹽更高。

+0

當心夥計,bin2hex(openssl_random_pseudo_bytes(22))將返回44個字符。 對於php河豚,你需要bin2hex(openssl_random_pseudo_bytes(11)) –