14

在将加密消息从服务器传输到客户端时,我有点困惑如何以正确的方式使用 AES 和 HMAC(基于 SHA-256),反之亦然

如果以下方法错误,请纠正我:

  1. 从密钥文件中获取安全密钥(例如,我们建议使用 AES-256,并且我们已经有一个有效的 256 位长度密钥)
  2. 为 AES-256 生成随机 IV 以确保相同的纯文本将具有不同的加密输出。
  3. 使用纯文本和安全密钥计算 HMAC-SHA-256。(第一个问题:我应该使用 IV 进行 HMAC 计算吗?例如附加到安全密钥?)
  4. 使用 AES-256 加密纯文本。
  5. 为客户端编写消息如下:HMAC + IV+ ENCRYPTED_MESSAGE

最大的问题是:是否有可能不将 IV 发送给客户端,而是以相同的方式生成它并且仍然是加密安全的?或者也可以发送IV?

我最终生成了随机 IV,因为需要相同的纯文本以不同的加密结果结束。

4

1 回答 1

14

不要发送 hmac(message)、aes(message)。如果您两次发送相同的消息,任何人都可以分辨出来。此外,您需要对密文进行mac以防止诸如padding oracle attack之类的攻击。

IV:一般来说,处理 iv 的简单方法是将它添加到密文中,因为它是固定长度的。然后您可以在解密之前读取这些字节。IV 可以是公开的,但它们必须是随机的。

HMAC:如果您的库支持,最简单的方法是在 GCM 模式下使用 AES(或者,最好是 EAX)。这实际上不是 HMAC,但它提供了同样好的经过身份验证的加密。如果不支持这些:

您确实需要计算 iv 和密文的 hmac。如果 || 是连接(如果处理字节数组,你可以用说数组复制来做)然后你想要

CipherText = iv|| aes(key1,iv,message)  
tag = hmac(key2,ciphertext)

然后发送(标签,密文)。在另一端,您运行相同的 hmac 调用以重新生成标签并将接收到的标签与计算出的标签进行比较。比较标签的 sha1 或 sha256 哈希而不是直接比较,这样您就不会在比较失败的地方泄漏。

您应该为 hmac 使用不同的密钥。在实践中,跟踪加密密钥的 sha1 总和就足够了。

于 2012-04-24T01:44:13.407 回答