這種密碼遷移策略安全嗎?
我想嚴格升級一些現有的使用者身份驗證令牌數據庫的安全性,以確保如果數據庫被盜,攻擊者將無法在合理的時間內猜出最弱的密碼。我知道對於選擇“密碼”作為密碼的人,我無能為力,但我認為我們可以保護大多數使用更大字典中單詞的人,例如“再生”。
一些數據庫來自 90 年代,現有的身份驗證令牌儲存為
MD5(salt + password)
有些鹽很弱。其他數據庫使用更好的雜湊和鹽,但仍然不足以抵抗當今電腦的攻擊。但是,我們不想等到人們登錄後才更新他們的數據庫條目。所以我的計劃是簡單地獲取密碼系統目前使用的任何散列算法的輸出,並將其輸入 bcrypt 並將結果儲存為新的身份驗證令牌,例如
bcrypt(MD5(salt + password), new_secure_salt)
**有沒有人看到這個程序的弱點?**在我看來,這不會比使用更糟糕,
bcrypt(password, new_secure_salt)
但我知道不要僅僅依靠自己來評估加密協議。我不會為新應用程序推薦這個過程,但是這個方法是我能想到的最好的方法,它可以立即以對使用者透明的方式保護整個數據庫的不安全儲存密碼。
總體構想是一個合理的遷移策略。好消息是所有使用者的安全性都在一次性操作中升級,而不是在每個使用者假設的下一次登錄時升級。當然,應該儲存原始的
salt
和new_secure_salt
應該儲存的,或者可能是從使用者鍵入的材料精確導出的某些部分,例如小寫的使用者名。使用
bcrypt(MD5(salt + password), new_secure_salt)
是一個巨大的改進MD5(salt + password)
:bcrypt 中的多次迭代(和一些記憶體使用)大大增加了給定密碼熵的密碼破解風險。對典型密碼使用MD5(salt + password)
而不是password
丟棄可忽略不計的密碼熵(誰在 68 個隨機字元中選擇 20 個作為密碼?)但是我會推薦scrypt而不是 bcrypt。Scrypt 使用密碼合法使用期間可用的記憶體,以進一步提高安全性;從定義 scrypt的論文中查看此表:
我能想到的唯一弱點與
salt
. 如果攻擊者可以多次選擇salt
並獲得相同的身份驗證令牌,則可以按照 Gaëtan Leurent 的實用密鑰恢復攻擊中的構想恢復密碼的前幾個字元APOP,一種基於 MD5 的質詢-響應身份驗證(在 IJACT,2008 中)。在上下文中,這可能主要是理論上的,結果證明是不可延展的。為了排除這種攻擊的任何可能性,將其包含在 中就足夠了。new_secure_salt``salt``salt``new_secure_salt
上述理論攻擊利用了在前兩個 64 字節 MD5 塊中找到兩個63
salt0
字節和127 字節salt1
的衝突是可行的。MD5(salt0 + 'e') = MD5(salt1 + 'e')
現在假設我們可以獲得這些salt0
和的身份驗證令牌salt1
;如果密碼以 開頭e
,則這些令牌匹配!反之亦然,幾乎可以肯定。這允許為密碼的第一個字元建構一個測試,並在適度數量的查詢中恢復它,然後繼續處理第二個字元,也許還有第三個字元;在那之後,尋找碰撞似乎變得相當困難。