2013-02-07 44 views
6

我建於PHP一個新網站的開發人員,我想知道究竟是最好的 東西使用散列。我已經看過md5和sha1,但是還有什麼更安全的。
對不起,如果這是一個nooby問題,但我是新來的PHP的安全,我試圖讓我的 網站儘可能的安全。什麼是鹽?
謝謝,
克瓦PHP - MD5,SHA,安全散列

+1

你打算如何使用散列?至於鹽見http://en.wikipedia.org/wiki/Salt_(cryptography) –

+0

密碼和用戶名 –

+0

提示:'bcrypt' - 就是這樣。 – Leigh

回答

9

首先MD5和SHA1已被證明是vunrable碰撞攻擊,並能彩虹 輕鬆提交(當他們看到,如果你哈希是他們共同的密碼數據庫中的相同)。
目前有兩件事足夠安全的密碼,你可以使用。
第一個是sha512。 sha512是SHA2的子版本。 SHA2還沒有被證明是 受到衝突攻擊,sha512會產生512位散列。下面是如何使用SHA512的 一個例子:

<?php 
hash('sha512',$password); 

另一種選擇叫bcrypt。 bcrypt以其安全的哈希而聞名。它的 可能是最安全的一個,也是最可定製的一個。
之前,你要bcrypt你需要檢查,如果你的服務器有它啓用,輸入 這段代碼開始使用:

<?php 
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) { 
    echo "CRYPT_BLOWFISH is enabled!"; 
}else { 
echo "CRYPT_BLOWFISH is not available"; 
} 

如果它返回它已啓用,下一步很容易,你只需要做一個bcrypt密碼 是(注更多的可定製性,你需要看到這個How do you use bcrypt for hashing passwords in PHP?):

crypt($password, $salt); 

現在回答你的第二個問題。鹽通常是一個隨機字符串,當您將它們散列時,您會在 的末尾添加所有密碼。使用鹽意味着如果有人得到您的數據庫 他們無法檢查散列的常見密碼。檢查數據庫是使用彩虹表調用的。哈希時應該總是使用鹽!

這裏是我的SHA1和MD5碰撞攻擊漏洞證明:
http://www.schneier.com/blog/archives/2012/10/when_will_we_se.htmlhttp://eprint.iacr.org/2010/413.pdfhttp://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdfhttp://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdfUnderstanding sha-1 collision weakness

+4

僅供參考:bcrypt因速度快而非常慢而着名(http://codahale.com/how-to-safely-store-a-password/)。 – ckruse

+0

很好的回答! – Mez

+0

@ckruse對​​不起,我會修復它:) – C1D

1

鹽的整個目的是攻擊者比較前期的列表減緩針對目標哈希生成哈希。

攻擊者需要爲每個明文密碼(2^7 * 2^7)預先計算16384個「散列」值,而不需要爲每個明文密碼預先計算一個「散列」值。

今天有點不合時宜,但當crypt函數第一次被開發時,這個函數非常大 - 計算能力可以預先計算出許多密碼乘以您懷疑(字典)的純文本密碼的次數。

這麼多的不是今天這就是爲什麼我們有東西像影子密碼,其他核心職能密碼除了地下室和每一個希望的SysAD你選擇一個密碼,也不會在字典中出現。

如果你想要生成的哈希是密碼,這是一個公認的實現它的方法。

http://www.openwall.com/phpass/

+0

感謝您的信息! –

+0

我不知道你是如何得到數字16384和醃製是一樣重要的。將每個密碼與不同的鹽結合起來時,攻擊者必須爲每個密碼創建一個彩虹表,並且不能使用1個彩虹表來獲取所有密碼。這是鹽的目的,這不是一個祕密,它不會幫助字典攻擊。 – martinstoeckli

+0

@martinstoeckli - 我認爲Danilo假定兩個7位ASCII字符爲鹽,因此有16,384個可能性。而且我認爲你們正在「彼此交談」,也就是說,我認爲你們兩個都在說同一件事。現在,每個「n」個密碼(或者概念上,現在是一個16K x「n」矩陣,而不是「n」個元素陣列)的16K條目不是用於「n」個密碼的彩虹表。 – Dan

0

如果你打算口令做到這一點,那麼不要使用MD5或SHA1。他們被稱爲弱和不安全,即使用鹽。

如果您將它們用於其他目的(例如,提供文件的散列以確認其真實性,或隨機散列數據庫列提供僞隨機排序順序),則它們都可以(直到某個點),但不能用於密碼或其他任何你認爲需要保持安全的東西。

當前用於密碼驗證的最佳實踐算法是BCrypt,並帶有合適的salting。

在PHP中實現BCrypt密碼散列的最佳方式是使用PHP的新密碼API。這個API將在未來幾個月發佈的下一個PHP版本v5.5中作爲一組內置函數提供。好消息是,他們還爲當前版本的PHP(5.3和5.4)的用戶發佈了向後兼容版本,因此即使PHP 5.5尚未發佈,您也可以立即開始使用新的API。

你可以從這裏下載兼容性庫:https://github.com/ircmaxell/password_compat

另外:你問什麼是「鹽」是。由於我在這個答案中提到過幾次,所以我也應該解決這個問題的一部分。

鹽基本上是一個額外的字符串添加到密碼哈希它,爲了使它更難以破解。

例如,攻擊者可能事先知道給定密碼字符串的哈希值,甚至是一大堆給定的密碼字符串。如果他能夠掌握你的散列數據並且你沒有使用鹽,那麼他可以將你的哈希與他已知的密碼列表進行比較,如果你的任何用戶使用一個容易猜到的密碼,他們會無論使用何種哈希方法,都會在幾秒鐘內破解。

但是,如果您在散列密碼時向密碼添加了一個祕密額外字符串,則哈希值與原始密碼的標準哈希值不匹配,從而使攻擊者難以找到值。

好消息是,如果您使用的是我上面提到的API,那麼您不必過多擔心這個細節,因爲API會爲您處理醃製。

希望有所幫助。