本文讨论了以下可能发生的情况:你不能通过类似 Galois/Counter Mode (GCM) 的认证加密模式来使用高级加密标准(AES)?你当前使用的平台不支持它,或者你必须兼容老版本或其它第三方协议?无论你放弃 GCM 的原因是什么,你都不应该放弃它所具有的安全属性:
- 保密性:没有密钥的人无法阅读该消息
- 完整性:没有人会修改消息内容
- 真实性:可以对消息的发送者进行验证
选择非认证加密,比如块模式密码分组链接(CBC),不幸的是,由于具备很好的延展性,它缺少后两个安全属性。如何解决这个问题?正如我在上一篇文章中所说的那样,一种可能的解决方案是将加密原语组合在一起以包含加密验证码(MAC)。
加密验证码(MAC)
那么什么是 MAC,我们为什么要使用它呢?MAC 类似于散列函数,这意味着它将消息作为输入并生成一个所谓的简短标记。为了确保并非任何人都可以为任意消息创建标记,MAC 函数需要一个密钥来进行计算。与使用非对称加密的签名相比,MAC 可使用相同的密钥来进行标记生成和认证。
例如,如果双方安全地交换了 MAC 密钥,并且每条消息都附加了认证标记,那么它们都可以检查消息是否是由另一方创建的,并且在传输过程中没有被更改。攻击者需要保密的 MAC 密钥来伪造身份进行标记验证。
最广泛使用的 MAC 类型之一是 散列消息密钥验证码(HMAC),它包含一个哈希加密函数,该函数通常是 SHA256。由于我不会详细介绍其算法,因此我建议你阅读相关 RFC。当然还有如 CBC-MAC 等其他可用于对称加密的类型。几乎所有的加密框架都至少包含一个 HMAC 实现,包括通过 Mac 实现的 JCA/JCE。
使用加密的 MAC:架构
那么正确应用 MAC 的方法是什么呢?根据安全研究院 Hugo Krawcyzk 的说法,这里有