为什么我不能使用相同的密钥进行加密和 MAC?

信息安全 加密 hmac
2021-09-02 19:59:32

我编写了一个简单的文件加密程序作为如何正确进行加密的示例,但是在阅读了有关加密 + MAC 的问题后,我认为我为两者使用相同的密钥而犯了一个错误。

我即将修复我的程序以生成更长的密钥并将其拆分,但我想知道,当你这样做时会发生什么坏事?

1个回答

将一把钥匙用于多种用途通常被认为是不好的风格。它并不直接暗示漏洞。如果方便协议设计,我偶尔会违反这个原则。

最重要的原因是,如果对多个方案使用相同的密钥,则需要考虑不同方案之间的交互。使用独立键,您无需担心这一点。

另一个担忧是一个方案可能会被破坏,从而允许密钥恢复。然后,该密钥恢复会破坏使用该密钥的协议的所有部分。例如,如果您实施了错误的 MAC 算法,则对该算法的破解可能不仅会破坏身份验证,还会破坏消息的机密性。

一些实际的例子:

  • 如果您使用相同的密钥,则将 AES-CBC 与 AES-CBC-MAC 一起用于加密将完全被破坏。
  • 使用 AES 和 HMAC-MD5/SHA-1/SHA-2 进行加密没有已知的交互。有这样的相互作用是难以置信的。
  • AES-CCM是一种使用 AES-CTR 进行加密,使用 AES-CBC-MAC 作为 MAC 的模式。可以证明,这种模式与 AES 本身一样强大。

这些例子表明,这种组合的实际安全性可以从完全破坏到可证明的安全。


正确的方法是从一个主密钥开始,然后使用密钥派生函数(例如 HKDF)来派生单个密钥。这些密钥是独立的,防止不同方案之间的交互。从单个密钥中恢复主密钥是不可行的,因此破坏系统的一部分并不会破坏基于该主密钥的所有其他内容。