當存儲密碼時,據說Salt不需要保密,而且唯一的目的是保持所有哈希都是唯一的。還有人說,限制密碼長度並不是一個好的做法,但考慮這個例子:保持內部密碼長度一致,並保持鹽的祕密?
在散列之前,我們通過將用戶輸入修剪爲最大值100來確保純文本版本始終爲128個字符,然後將附加字符作爲我們的鹽。
因此,如果用戶輸入20個字符,我們追加108個隨機字符作爲鹽。如果用戶輸入100,我們追加28,依此類推。重點是,純文本版本的長度應該是128個字符。在代碼中它可能是這樣的:
$salt = generate_salt($pass); // length varies as explained above
$hash = hash('sha512', $pass.$salt);
這樣,我們的「純文本」散列之前將永遠是128個字符。
我們儲存在服務器A $哈希值和$鹽存儲服務器B上
現在讓我們假設攻擊者獲得對哈希DB(服務器A),並設法扭轉哈希值。對他來說看起來不錯,但他看到的純文本版本(或反轉哈希)仍然看起來像哈希,因爲它是128個字符。由於他不知道鹽,他永遠不會知道原始密碼。
作爲一個額外的挑戰,由於SHA512產生128個字符的事實,他也不能確定他是否已經到達純文本版本,因爲(如前所述)純文本版本看起來像哈希。顯而易見,他可能認爲這是一個迭代版本,如果是這樣的話,他可能會無限期地繼續迭代。
是否有使用這種方法的任何問題,因爲在哈希逆轉的情況下,保持鹽祕密提供額外的安全性,並保持純文本的長度均勻無疑增加了混淆層?
注:這當然是假定您的應用程序有多個失敗的登錄檢測/防禦。
散列的一點是你不能倒過來。 – zimdanen 2012-04-30 13:33:06
@zimdanen同意,但它通過彩虹/字典攻擊是「可逆的」 – IMB 2012-04-30 14:10:48
這就是爲什麼你想要一個鹽,但是,正如你和答案所提到的,鹽不需要保密。散列本身將保持數據的祕密;鹽只會增加計算彩虹桌的複雜性。 – zimdanen 2012-04-30 14:13:08