Signature

HMAC 和 SHA-1 的弱點?

  • January 14, 2018

想像以下場景:

  1. 選擇已知數據(多方已知)
  2. 將數據與密鑰混合併生成 SHA-1 雜湊
  3. 將 SHA-1 雜湊與密鑰混合併生成 HMAC

目的是驗證數據的完整性——確保在生成 HMAC 後數據沒有被更改。

我的問題是:

  • 在這種情況下使用 SHA-1 雜湊而不是例如 SHA-256 是否有任何弱點?
  • 與 SHA-256 相比,使用 SHA-1 是否更容易提取密鑰?

選擇已知數據(多方已知)

如果數據是已知的,則沒有理由分發它。你可以參考一下。

將數據與密鑰混合併生成 SHA-1 雜湊

這就是您使用 HMAC 的目的。

將 SHA-1 雜湊與密鑰混合併生成 HMAC

您通常只會使用一次對稱密鑰。


在這種情況下使用 SHA-1 雜湊而不是例如 SHA-256 是否有任何弱點?

它的輸出較小,因此對暴力攻擊的保護較少,但 HMAC 本身並不容易受到攻擊。然而,SHA-1 正受到攻擊,最先出現的是抗碰撞性。如果你設法搞砸了第 2 步,那麼你可能會遇到麻煩。如果您使用 HMAC,那麼您可能不會直接受到目前已知攻擊的攻擊。但攻擊只會變得更好。

與 SHA-256 相比,使用 SHA-1 是否更容易提取密鑰?

不,SHA-1 的抗碰撞性可能較低這一事實並不意味著該算法是可逆的。


也就是說,除非有使用 SHA-1 的迫切要求,例如向後兼容性,否則我寧願選擇 SHA-256 或 SHA-512/256。

關於 SHA-1 與 SHA-256,SHA-1 在某種程度上已被棄用,因為它在某些應用程序中已經接近被破壞的程度令人不安:它可能會以低於 100萬美元的成本產生衝突(儘管已經有一段時間了)做出了這個預測,但還沒有人發表過碰撞)。在您的場景中,重要的屬性不是抗碰撞性(即無法找到 X 和 Y,使得 SHA-1(X) = SHA-1(Y) 但 X ≠ Y),而是抗原像性(無法找到 X給定 SHA-1(X))。沒有任何已知的針對此屬性的攻擊幾乎是可行的。因此,雖然使用 SHA-256 會很好,但 SHA-1 也可以。

記住 HMAC-SHA-1(secret key, data) 足以驗證數據的完整性,而不會讓不知道密鑰的實體找到數據是什麼。甚至 SHA-1(數據)也大多會這樣做,除非對手可以驗證對數據的猜測。使用 HMAC-SHA-1,對手無法在不知道密鑰或詢問知道密鑰的一方的情況下驗證猜測。如果您唯一關心的是驗證完整性,那麼 SHA-1 就足夠了。

您的步驟 2 不是必需的,您應該跳過它。大概沒有害處,但它可能是。這完全取決於您如何“將數據與密鑰混合”。一般來說,將同一個密鑰用於多個目的是一個壞主意,因為密鑰的使用方式可能會出現巧合。例如,如果您在第 2 步執行此組合的方式是計算 HMAC-SHA-1(secret key, data),那麼您的完整性值為 HMAC-SHA-1(secret key, HMAC-SHA-1(secret key , 數據))。如果中間值洩露給對手,那麼他們可以將其作為數據送出,然後他們可以讓您的系統計算 HMAC-SHA-1(secret key, HMAC-SHA-1(secret key, HMAC-SHA-1 (密鑰,數據)))等等,這可能會給它們帶來一些優勢,例如用其 HMAC 替換一些數據。這種協議攻擊往往只有在事情恰到好處的情況下才會起作用,但在實踐中,有時確實會發生正確對齊的情況,這可能會完全破壞原本安全的系統。因此,不要將相同的密鑰用於不同的目的。

如果您需要在協議中的不同位置使用秘密材料,則將您的秘密材料用作主秘密而不是密鑰,並應用密鑰派生函式為每個目的生成獨立的實踐密鑰。但是在這裡你應該簡單地省略步驟 2 並且只使用一次密鑰,用於單個 HMAC 步驟。

引用自:https://crypto.stackexchange.com/questions/40129