在現有系統中升級密碼雜湊:Pbkdf2( salt , OldSha1Hash )
背景
$$ Updated $$
考慮一種情況,一個網站是在十多年前創建的,使用者帳戶密碼儲存是通過儲存
SHA1(password)
到數據庫中來完成的。 將系統升級為Pbkdf2(salt, password)
使用 HMACSHA256 作為 prf 進行密碼散列的大工作因子(例如 50000)會很棒。結果hash | salt
可以儲存在數據庫中,並用於在訪問者返回並提供密碼時驗證訪問者。這種方法似乎在 crypto.stackoverflow.com 上得到了很好的評價。如果能夠改進所有現有帳戶的散列而不需要使用者重置密碼,那就太好了。所以我想知道從安全形度來看,以下方法是否很好。
OldHash = SHA1(password) UpgradedHash = Pbkdf2(salt , OldHash ) StoredInDatabase = UpgradedHash | salt
這種方法的一個理想特性是,所有現有的密碼雜湊都可以升級為使用 Pbkdf2、salt 和高工作係數,而無需重置密碼。甚至可以以相同的方式處理所有新密碼,以保持所有雜湊一致。所以新密碼可以像這樣工作:
Hash = Pbkdf2(salt , SHA1(password)) StoredInDatabase = Hash | salt
升級散列的理由 升級
密碼散列的需要是因為 SHA-1 散列不包括鹽,並且 SHA-1 已被報告為損壞。升級數據庫中的密碼散列的目的是降低可以訪問密碼散列數據庫的黑客獲得這些帳戶相應密碼的可能性。
問題
這看起來像是在現有系統中升級密碼散列方法的安全有效方法嗎?
是的,主要是
但是等等,SHA-1 不是壞了嗎?
這是。截至 2017 年,SHA-1 發現了衝突。但這對我們的使用並不重要,因為我們只要求 SHA-1 不會對我們的輸入發生衝突。不同之處在於,對於 2017 年的攻擊,攻擊者知道明文並試圖找到另一個給出相同雜湊的明文,在我們的例子中,攻擊者什麼都不知道(甚至不知道雜湊)。而且我們可以假設 SHA-1 不會與現實生活中的密碼發生衝突,因為如果是這種情況,那將是 SHA-1 的非常重大的破壞(這會更早發現)。
但是有一個問題:SHA-1 會將您的安全性限制為 80 位,因為它具有 160 位輸出,並且生日攻擊可以將安全性“限制”到輸出位的一半(在我們的例子中)。這實際上是 PKDBF1 被 PKDBF2 所取代的原因,但大多數密碼的安全性遠非 80 位。
注意:我的回答中沒有考慮任何其他問題。在這一點上,PKDBF2 的選擇也可能被認為是過時的。我個人會建議 Argon2(但有些人會認為它太新而無法採用)。正如其他人指出的那樣,PKDBF2 也沒有一個輸入,但我認為它只是被忽略了。