2013-10-02 87 views
4

假設我們不使用password_hash,而是使用crypt()而不是sha512來代替散列密碼。我們需要向密碼添加salt,因此攻擊者不能使用彩虹表攻擊。爲什麼鹽必須是良好和很多隨機答案中所述的很多答案?即使鹽相差一點或者不是很隨意,它仍然會給別人一個完全不同的散列。因此,攻擊者不會知道誰使用相同的密碼,他仍然無法創建一個彩虹表。爲什麼要吃好鹽?

+0

好鹽和隨機鹽應該是不可能「猜測」鹽的。 – Rufinus

+1

「好」我假設你的意思是「隨機」,在這種情況下,你應該閱讀[這個答案](http://stackoverflow.com/a/1645190/139010),特別是「所以,爲什麼鹽必須是隨機?」 –

+2

@Rufinus如果他得到密碼,他會得到鹽。 –

回答

2

計算和儲存強鹽需要很少的努力,但降低了彩虹表預先計算的鹽的天然小的機會。

如果鹽是3位數字,攻擊者可能會爲所有可能的鹽組合預先計算彩虹表是可行的。如果salt是一個隨機的24個字符的字母數字字符串,那麼攻擊者可以預先計算所有可能的鹽的機率幾乎爲零。

2

鹽應該是獨特的,必須足夠長,並且應該是不可預測的。隨機性不是必需的,但它是計算機滿足這些要求的最簡單方法。鹽不是祕密的目的,即使知道鹽也會達到它的目的。

唯一性意味着它不僅在數據庫中是唯一的(否則您可以使用用戶標識),它應該是全球唯一的。有人可以爲例如例如1-1000,並能夠檢索具有這些用戶標識的所有帳戶的密碼(通常管理帳戶的用戶標識低)。

足夠長:如果鹽太短(可能的組合太少),再次建立彩虹桌會變得有利可圖。鹽和密碼一起可以被看作只是一個更長的密碼,如果你可以爲這個更長的密碼建立一個彩虹表,你也可以得到較短的原始密碼。對於非常強大和長時間的密碼,醃製實際上根本不是必需的,但大多數人爲生成的密碼可能是蠻橫的,因爲它們很短(人們必須記住它們)。

也使用從其他參數衍生的鹽可以歸入此類別。僅僅是因爲你從用戶ID計算散列,這不會增加可能的組合。

不可預測性是有點不那麼重要,但試想一次您使用的用戶ID爲鹽的情況下,攻擊者可以找出未來幾年用戶ID是什麼,因此可以預先計算rainbow-的窄數表。根據所使用的散列算法,這可以適用或不適用。他有時間優勢,可以立即取回密碼。如果管理員帳戶使用可預測的鹽,則會出現更多問題。

因此,使用真正的隨機數,從OS隨機源(dev/urandom)生成,是最好的,你可以做的。即使你忽略了上面的所有原因,爲什麼當有更好的方法時使用衍生鹽,爲什麼不使用你知道的最好方法?