我有点困惑如何在从服务器向客户端传输加密消息时以正确的方式使用AES和HMAC(基于SHA-256)
如果以下方法有误,请纠正我:
最大的问题是:是否有可能不以某种方式不向客户端发送IV,而是以相同的方式生成它并仍然是加密安全的?或者也可以发送IV吗?
我最终会生成随机IV生成,因为需要相同的纯文本最终会出现在不同的加密结果中。
答案 0 :(得分:12)
不要发送hmac(消息),aes(消息)。如果您发送两次相同的消息,任何人都可以告诉。此外,您需要使用密码文本来防止padding oracle attack之类的攻击。
IV:一般来说,处理iv的简单方法是将前缀(因为它是固定长度)添加到密文中。然后您可以在解密之前读取这些字节。 IV可以是公开的,但它们必须是随机的。
HMAC:最简单的方法,如果你的库支持它,就是在GCM模式下使用AES(或者更不用说EAX)。这实际上不是HMAC,但它提供了经过验证的加密,这也是一样好。如果不支持:
您需要在iv和密码文本上计算hmac。如果||是串联(你可以用数组副本处理字节数组)然后你想要
CipherText = iv|| aes(key1,iv,message)
tag = hmac(key2,ciphertext)
然后发送(tag,CipherText)。另一方面,您运行相同的hmac调用以重新生成标记,并将接收的标记与计算的标记进行比较。比较标签的sha1或sha256哈希值而不是直接比较,这样就不会在比较失败的地方泄漏。
您应该为hmac使用不同的键。在实践中,添加加密密钥的sha1总和就足够了。