2010-11-21 37 views
5

這看起來像一個安全的鹽與密碼一起使用嗎?任何改進或建議或明顯的缺陷?這看起來像是一個密碼的強鹽

$salt = ''; 
for ($i = 0; $i < 50; $i++) { 
    $salt .= chr(rand(33, 126)); 
} 
+0

你必須知道鹽!這不僅僅是單向哈希,它是一次哈希!這是沒用的。 – aliqandil 2014-04-03 03:27:11

回答

8

您不需要使鹽時間很長,並且加密安全並不重要。鹽的重點在於簡化彩虹表攻擊,因爲密碼和哈希之間不再有1對1的映射關係。 (他們也跟上目光流連管理員從數據庫中看到482c811da5d5b4bc6d497ffa98491e38然後知道喬的密碼是「password123」。)

即使是一個4字節的鹽就綽綽有餘了,你現在就得2 &約;任何密碼都有40億個潛在的哈希值。

+0

值得指出的是,那些具有相同密碼的40億_different_哈希依賴於散列算法的適當選擇。 – 2010-11-21 22:57:41

+0

管理員不能訪問源代碼嗎?他不能只將純文本記錄到文件中嗎? – rook 2010-11-21 23:40:21

+0

@Graham Lee,我正在使用SHA512。 – sami 2010-11-21 23:40:49

3

我會用mt_rand因爲它更快,但這是絕對鹽足夠。

5

我不認爲rand是一個很好的PRNG。如果我記得正確的話,它直接映射到c PRNG,在許多實現中它有一個可怕的小(如32位)內部狀態。

它也不是很好的種子。但是由於鹽的最重要的作用是防止預先計算的彩虹表,這個代碼所做的就應該足夠了。

我通常分割我的兩個部分鹽:

  1. 甲每人用戶部分隨機其被存儲在數據庫中沿着散列
  2. 其被存儲在配置文件中的每個應用程序的鹽。

這樣一個攻擊者只能訪問數據庫而不能訪問配置文件(如果攻擊使用SQL注入,很可能出現這種情況),他仍然無法破解密碼。

3

長度是主要使鹽安全。隨機性並不是非常重要,只要它對每個用戶都不同。反正你最終會以純文本的方式存儲它,所以你可以在散列時使用它。

相關問題