【发布时间】: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()];
如果客户端发送加密消息,服务器如何检索ivSpec、hMac.getMacLength()和hMacKey?服务器需要这些项目来解密来自客户端的消息。
我知道初始化向量 (IV) 可以从密文中保留,因为它附加到结果密文的开头(我认为我必须手动添加它,因为我认为 AES 密码不会那样做?)。然而,用于验证消息完整性的 hMacKey 和 hMac 长度仍然是个谜。
最后一点,有人能解释一下这条线的目的是什么吗?这是加密还是解密?
cipherText[9] ^= '0' ^ '9';`
【问题讨论】:
-
您正在查看的示例的名称是“Tampered ...”。最后一行旨在向您展示密文被篡改时会发生什么。如果你运行这个例子,Hmac 应该会失败。
-
啊,好的。这就说得通了。 hMacKey 或 hMac 长度呢?是否可以使用相同的密钥重新生成相同的 hMacKey?
-
只需使用 SSL/TLS,您不必担心细节。此外,最好先加密然后进行身份验证,而不是反过来,以避免对您的密码进行选择密文攻击。
标签: java encryption aes hmac hmacsha1