我什麼時候需要使用 CBC 和 HMAC?
據我所知,CBC 不提供消息的完整性,因此 HMAC 用於為 CBC 消息提供完整性。另外,我聽說可以提供完整性和機密性的 CBC-MAC。CBC-MAC 或 CBC 與 HMAC 哪個更好?我什麼時候需要使用 CBC 和 HMAC?
此外,還有用於提供完整性和機密性的 CBC-MAC。CBC-MAC 或 CBC 與 HMAC 哪個更好?
通常,詢問哪個更好會導致固執己見的答案。
然而,由於 CBC-MAC 不能用於動態大小的消息,並且在使用相同的密鑰時可能會導致妥協,因此 HMAC 肯定不太容易被濫用。措辭不同:CBC-MAC比 HMAC更脆:濫用時可能會破裂。
CCM 認證的操作模式顯示了它仍然可以正確使用的 CBC-MAC,它使用 AES-CTR 來保證機密性,使用 AES-CBC-MAC 來保證消息的完整性和真實性。在 CCM 模式下將 CTR 模式替換為 CBC 是不明智的,因為 CBC 與 CBC-MAC 很可能會引入安全漏洞。
$$ EDIT $$: 我完全讀過這句話是“誠信和保密”。CBC-MAC 是一種 MAC 算法,源自CBC 操作模式,因此得名。它本身不提供機密性,它只提供消息完整性和消息身份驗證。有關詳細資訊,請參閱Luis 的回答。這也是為什麼將 CBC 和 CBC-MAC 配對是不明智的(參見上一節)。
我什麼時候需要使用 CBC 和 HMAC?
除了 CBC 模式提供的機密性之外,還需要消息完整性和/或消息真實性時,您可以使用它。也就是說:如果您擔心密文會被對手更改。通常傳輸協議需要消息完整性/真實性。
但是,通常我們為此使用現代認證的操作模式。AES-GCM 和 EAX 等 AEAD 密碼比將 CBC 和 HMAC 放在一起更健壯。例如,很容易忘記將 IV 包含在身份驗證標籤的計算中。如果忘記了這一點,那麼對手仍然可以更改第一個密文塊。同樣,CBC 需要一個與對手無法區分的隨機 IV,而大多數 AEAD 密碼需要一個隨機數(可以是隨機的,但也可以是計數器)。
EAX 在內部使用 CMAC(或 OMAC)作為 MAC。CMAC 建立在 CBC-MAC 之上,以確保動態大小的消息安全。前面提到的使用 CBC-MAC 的 CCM 模式也是安全的,但作為數據包模式密碼,它可能很難使用(更不用說實現了,正如我發現的那樣)。
有一個名為AES-CBC 和 HMAC-SHA 的 Authenticated Encryption的 RFC 草案,它試圖將 CBC 和 HMAC 標準化為 AEAD 密碼。那沒有成功(大多數其他模式更有效)但是如果您想將 CBC 與 HMAC 一起使用,那麼它會顯示一些最佳實踐。