2011-08-18 61 views
5

我一直在折騰如何將密碼存儲在我的數據庫中一段時間​​的問題。這是我第一次通過網絡登錄創建一個安全的應用程序,所以我想建立一些良好的實踐。散列和醃製密碼字段

首先,我讀了散列和醃製。看來這個想法是......

  1. 獲得哈希算法
  2. 獲得來自用戶的密碼
  3. 從用戶添加「鹽」以明文密碼
  4. 哈希整個密碼(包括食鹽)
  5. 存儲在數據庫中的鹽,這樣就可以在以後檢索(爲PSWD驗證)

這讓我思考......如果黑客知道你的鹽(b因爲它存儲在數據庫的某處,可能是一個名爲this_is_not_the_salt_ur_looking_for的列或者其他含義不明的列),他們可以重新生成密碼字典並獲得訪問權限。

然後我有一個想法。如果您將鹽存儲在哈希密碼字段中,該怎麼辦?所以按照步驟1-4(隨機地產生的鹽),則在步驟5中,插入在由密碼口譯類或服務某處已知的密碼的鹽:

xxxxxsaltvaluexxxxxxxxxxxxxxxx

其中x是散列字符串值。任何人都可以看到這個問題嗎?這完全沒有必要嗎?

答案:
沒有理由不能這樣做。正如Yahia所說,保護密碼的其他方法包括雙(或n)散列。在另一個說明中,BCrypt看起來像是一種幾乎完全停止蠻力攻擊的好方法,但我找不到C#的可信庫。
TTD

+0

我一直在想這個問題, 。 –

回答

6

從安全的角度看是沒有必要的,只要你只存儲哈希密碼(NEVER店的明文密碼!)加上鹽...攻擊者是「允許」知道鹽 - 你的安全必須設計的方式,即使有了鹽的知識,它仍然是安全的。

鹽是做什麼的?

使用預先計算的「彩虹表」防止鹽暴力攻擊暴力攻擊。
鹽使攻擊者的暴力成本(時間/內存)更加昂貴。
計算這樣的表格非常昂貴,通常只有當它可以用於多個攻擊/密碼時才能完成。
如果您對所有密碼使用相同的鹽,攻擊者可能會預先計算這樣一個表,然後將您的密碼暴力破解爲明文...
只要您爲每個密碼生成一個新的(最好的密碼強壯的)隨機鹽你想存儲密碼的密碼沒有問題。

至於「僞裝」鹽
也就是說更多的「默默無聞安全」應該避免你的想法。
雖然在這種情況下我沒有看到任何積極的消極影響。

如果您想進一步加強安全
你可以計算哈希幾次了(哈希散列等等) - 這不會花費你很多,但它使蠻力攻擊/計算「彩虹桌」更昂貴...請不要發明自己 - 有已證明的標準方法這樣做,例如見http://en.wikipedia.org/wiki/PBKDF2http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

+0

您將在哪裏存儲鹽 - 在數據庫中,在軟件中,在配置文件中...?你說攻擊者可以知道鹽,所以或許它存儲在哪裏並不重要,因爲知道它是什麼沒有好處 - 或者是否存在? – GeoffM

+0

我會將它存儲在數據庫中...如果你想使攻擊者更難(有點),你可以將鹽和散列存儲在不同的表中 – Yahia

+0

瞭解,謝謝。 – GeoffM

3

你即將陷入兔子洞。 Use bcrypt

+0

感謝您的支持,但我一直在尋找隱藏鹽的方法,這樣暴力攻擊就毫無結果,除非黑客知道密碼的哪個索引開始,鹽的長度和它的長度。 –

+0

+1有趣關於bcrypt的信息。 –

0

只需對密碼進行哈希處理,並將哈希值保存到數據庫中,一旦用戶再次登錄,您可以計算他所進入的密碼的哈希值並將其與數據庫中保存的哈希值進行比較,您不需要知道密碼。如果他獲得了Hashvalue,黑客就無法獲得密碼。

如果您使用Salting,您將通過保存它所屬的Salt和Hash值來提高安全性,使用生成的salt與計算散列值的密碼結合計算最終值,不會保存密碼在你的數據庫中,但只有計算出的哈希值,這意味着一個evtl。黑客不能做任何事情只有哈希值和鹽。

this

+0

我意識到我的問題是誤導。我已經哈希密碼,我正在尋找一種隱藏鹽的方法,將它存儲在密碼字段中的已知索引處。因此,一個16字符的密碼與一個6字符的鹽將長達22個字符 –