HMAC 中外鍵的用途
據我所知,HMAC 結構有兩個優點:
- 它可以抵抗長度擴展
- 由於密鑰在消息之前被消耗,攻擊者不知道初始狀態,防止了簡單的碰撞攻擊。
但簡單的構造 $ \mathrm{Hash}(\mathrm{Hash}(\mathrm{key} ∥ \mathrm{message})) $ 也會提供這些屬性。
另一方面,HMAC 使用更複雜的結構 $ \mathrm{Hash}((\mathrm{key} ⊕ \mathrm{opad}) ∥ \mathrm{Hash}((\mathrm{key} ⊕ \mathrm{ipad}) ∥ \mathrm{message})) $ . 我認為某些安全證明需要更複雜的 HMAC 結構,但我不立即明白為什麼。
對於 SHA-3 候選者,Hash(key||message) 被認為是安全的,因為它們可以抵抗長度擴展,而不會兩次使用密鑰。我相信 Skein 甚至為非常相似的模式提供了一些安全證明。
那麼為什麼 HMAC 需要兩次注入密鑰呢?
您錯過了 HMAC 最重要的優勢:它帶有安全性證明(在一些合理的假設下)。外鍵在證明中起著重要作用。了解更多資訊的最佳地點是閱讀 HMAC 論文:
- 使用散列函式的消息認證:HMAC 構造,Mihir Bellare,Ran Canetti,Hugo Kawczyk,CryptoBytes Spring 1996。
- 消息身份驗證的密鑰雜湊函式,Mihir Bellare,Ran Canetti,Hugo Kawczyk,CRYPTO ‘96。
特別是,對於他們的證明,外部功能是鍵控是非常重要的。在您的方案中,外部函式沒有鍵控,因此它們的安全證明將不適用。
正如他們在論文中解釋的那樣,內部函式的作用是提供抗碰撞性(將長消息壓縮為短指紋,以使不知道密鑰的人無法找到一對消息同指紋),而外層函式的作用是在這個指紋上充當消息認證碼。他們的安全證明表明,如果內部和外部功能都正確地實現了它們的角色,那麼組合(HMAC)將是一個安全的消息認證碼。因為外部函式需要是一個安全的消息驗證碼,這意味著外部函式需要被加密才能應用他們的證明方法。
閱讀論文。對於理論上的工作,它們的可讀性令人驚訝。
作為 Skein 的合著者,UBI 連結模式的屬性之一是一次性為您提供類似 HMAC 的屬性。Skein 本身由 Threefish 可調整分組密碼、UBI 連結模式和一些證明組成,這些證明將可調整分組密碼理論擴展為可調整雜湊函式理論,從而將雜湊函式的安全性降低到塊密碼的安全性。(順便說一句,Skein 團隊的優勢之一是我們都擁有某些優勢,我們將這些優勢帶到了整體的某些部分;Mihir 帶頭進行了證明,他是 HMAC 的合著者。)
其中一項功能是您可以通過 Skein 免費獲得一次性 MAC。
相比之下,HMAC 是任何散列函式的包裝器,它(通常)增強了其安全性。在關於 HMAC 的 CryptoBytes 文章的介紹中,他們說,
“眾多困難之一
$$ of constructing a MAC from a hash function, as opposed to a cipher $$是它們甚至不是鍵控原語,即不能自然地適應秘密密鑰的概念。” 在 HMAC 之前提出了幾種結構,但它們缺乏令人信服的安全分析。
HMAC 創建一個圍繞任意散列函式的包裝器,並為您提供散列函式所沒有的一些安全屬性。Skein 設計了一個可調整的雜湊函式,正是這種調整為您提供了一種安全輸入密鑰的機制。
喬恩