何时将 HMAC 与 AES 一起使用?

信息安全 密码学 AES hmac
2021-08-11 02:22:24

我的一个客户想要为他的每个客户提供一个 URL 以在系统中注册。这个 URL 将包含一个查询字符串参数,其中包含来自他的客户的一些数据(例如代码、电子邮件和姓名),使用 AES 和 CBC 加密,类似于此(IV 以粗体显示):

www.website.com/register?key= 44a74fb9fad889496e970c604e54fdab a367c6e5802252822ce071c35d7f108aea43e6de925cf93dd3d4772974621927a12702428b1d22d82b6f976acc7

当用户进入该页面时,它会对其进行解密并检查数据是否有效(例如,客户的代码在外部数据库中是否有效以及是否尚未注册),以便向他展示注册表单。

我见过一些人使用 HMAC 和 AES 来加密数据,但我不知道在这种情况下是否需要这样做。我的问题是:这足够安全吗?在使用 AES 加密数据以验证数据之前,我是否应该将 HMAC 之类的东西与明文一起使用?

1个回答

AES是加密这是为了保密加密本身并不能保持完整性:可以访问加密数据的攻击者可以修改字节,从而影响明文数据(尽管加密使攻击者的任务更加困难,但它并不像通常假设的那样不可行)。

为了获得完整性,你需要一个MAC,而 HMAC 是一个很好的 MAC 算法。

在强制加密的许多情况下,还必须保持完整性,因此,作为一般规则,“单独”AES 是不够的。在您的情况下,潜在的攻击者是客户自己;每个客户都可能尝试更改 URL 以访问其他人的数据,或者能够以其他名称注册,或者诸如此类。据我了解,您的“客户”希望继续成为注册的主人;他想决定哪些客户可以注册以及使用什么名称。因此,检查完整性是必要的。


有几种方法可以将基于 AES 的加密与 HMAC 相结合;他们中的大多数都是坏的。有关该主题的一些讨论,请参阅此问题。简而言之:

  • 如果可以,请使用GCM或其他模式,这些模式可以安全地结合加密和 MAC。

  • 如果你不能使用 GCM(因为你的服务器端编程框架缺乏支持),那么你必须做旧式的事情:

    • 用 SHA-256对密钥K进行散列,得到 256 位的“密钥材料”。将其分成两半:128 位用于加密(K e),128 位用于 MAC(K m)。
    • 生成一个 128 位的随机IV每次加密时都需要一个新的,并且希望使用强 PRNG ( /dev/urandom) 生成它。
    • 填充数据(通常为 PKCS#5 填充),使其长度是 AES 块大小(16 字节)的倍数。
    • 在 CBC 模式下使用 AES 加密数据,使用上面生成的 IV,并将K e作为密钥。让我们称C为生成的密文。
    • 用密钥K m在IVC的连接上按该顺序计算 HMAC/SHA-256 。调用M结果值。IV是 HMAC 输入的一部分,这一点至关重要。
    • 按此顺序连接IVCM这是您的“注册密钥”。
    • 收到注册请求时,首先验证 HMAC(通过重新计算),然后(并且只有这样)继续进行解密步骤。

当然,所有这些都假设有一个密钥K,您的客户端可以使用它为客户生成注册密钥,并且您的服务器也知道以验证和解密传入的注册请求。与所有密钥一样,请注意存储位置。