【问题标题】:Confused how a client and a server using AES and Hmac will verify each other对使用 AES 和 Hmac 的客户端和服务器如何相互验证感到困惑
【发布时间】:2012-03-22 16:07:54
【问题描述】:

场景是这样的:我有一个客户端和服务器在交谈。这是标准的想法:

  • 使用 Diffie-Hellman 在客户端和服务器之间生成密钥。
  • 在客户端和服务器上将此密钥用于 AES/CTR/PKCS7Padding 密码。
  • 在原始消息上使用 Hmac
  • 使用 AES 密码加密 Hmac 消息

所以这将允许客户端和服务器安全地交谈。

我正在查看的相关代码示例是这里的教程:Tampered message with HMac, encryption with AES in CTR mode : Advanced Encryption Standard « Security « Java Tutorial

我能够为客户端和服务器生成密钥。我可以使用 Hmac 和 AES 对其进行加密。由于加密和解密是独立发生的,我不确定如何检索解密所需的相关信息。

这是我感到困惑的部分:

cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);

byte[] plainText = cipher.doFinal(cipherText, 0, ctLength);
int messageLength = plainText.length - hMac.getMacLength();

hMac.init(hMacKey);
hMac.update(plainText, 0, messageLength);

byte[] messageHash = new byte[hMac.getMacLength()];

如果客户端发送加密消息,服务器如何检索ivSpechMac.getMacLength()hMacKey?服务器需要这些项目来解密来自客户端的消息。

我知道初始化向量 (IV) 可以从密文中保留,因为它附加到结果密文的开头(我认为我必须手动添加它,因为我认为 AES 密码不会那样做?)。然而,用于验证消息完整性的 hMacKey 和 hMac 长度仍然是个谜。

最后一点,有人能解释一下这条线的目的是什么吗?这是加密还是解密?

     cipherText[9] ^= '0' ^ '9';`

【问题讨论】:

  • 您正在查看的示例的名称是“Tampered ...”。最后一行旨在向您展示密文被篡改时会发生什么。如果你运行这个例子,Hmac 应该会失败。
  • 啊,好的。这就说得通了。 hMacKey 或 hMac 长度呢?是否可以使用相同的密钥重新生成相同的 hMacKey?
  • 只需使用 SSL/TLS,您不必担心细节。此外,最好先加密然后进行身份验证,而不是反过来,以避免对您的密码进行选择密文攻击。

标签: java encryption aes hmac hmacsha1


【解决方案1】:

首先,对于这种事情,如果您真的这样做,请使用 SSL。出于教育目的,这些东西很酷。

正如其他人所说,这是一个证明 HMAC 在密文被篡改时有效的示例。因此cipherText[9] ^= '0' ^ '9';

为了使用 HMAC,您必须验证您使用密文获得的消息身份验证标签(由 hmac 返回的内容)是否与您应该拥有的匹配。要在此代码中执行此操作:1) 使用您协商的密钥解密消息,2) 使用您协商的不同密钥计算该文本的 hmac,然后 3) 比较两者是否相同。

由于您知道这些密钥,因此您可以解密消息并计算 mac。顺便说一下,mac的长度,是hmac函数的一个固定属性,是公知的。

因为你必须有生成有效标签的密钥,如果它们匹配,那么消息是真实的。

请注意,此代码可能不安全,因为您需要 MAC 密文,而不是明文。如果你不这样做,你最终会遇到像Padding oracle attack 这样的问题,它破坏了一堆网站的安全 cookie 实现。对这类事情使用 SSL。

【讨论】:

  • 谢谢,我会落实你的建议。
  • 在这种情况下,hmac明文和密文有区别吗?该示例在密文中翻转了一点,hmac 捕获了错误。那么这里不需要hmac-ing密文吗? (这也只是为了学习。感谢到目前为止的建议!)。
  • 是的,有很大的不同。如果是明文,那么我可以将不良数据提供给解密函数。例如,我可以更改填充数据。当你这样做时,大多数密码会返回并错误提示填充错误。我可以用它来阅读消息。如果我mac密文就没有这个问题了。
猜你喜欢
  • 2016-02-15
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多