考虑一个将由我将编写的 C# 库加密的文件,其中包含一个 64 字节的 HMAC,紧接着是用 AES 256 加密的加密数据。16 字节的 IV、32 字节的 key 和 64 字节的HMACSHA512 初始化 key 将通过单个字符串密码来自 Rfc2898DeriveBytes,由用户输入(4096 次迭代,以及来自 random.org 的单个盐)。
这种设计是否有任何负面的安全隐患?
我是不是做得太过了? (它,用 64 字节的初始化 key 或 4096 次迭代)
我希望能够解密任何数据,以便使用嵌入式 HMAC 验证密码是否正确(即“解密文件是原始文件”)。具体来说,我希望避免诸如“填充无效且无法删除”之类的错误。关于如何解决这个问题有什么想法吗?
最佳答案
是的,IV 应该放在密文的前面并且应该是随机的。如果您使用 Rfc2898DeriveBytes,您每次都会获得相同的 IV,因此加密不同的纯文本将导致相同的密文,从而泄露信息。
是的,64 字节的初始化 key 有点多。 16 到 32 个字节应该绰绰有余。也就是说,它对性能没有太大影响,所以...4Ki 迭代很好(为什么不只是 4000,算法不会改变)。
是的,将 HMAC 置于加密数据之上,并确保在解密(最后一个 block )之前验证 HMAC。通常 HMAC 位于密文之后(因为流式实现只有在加密所有密文后才知道 HMAC)。
或者,您可以在 GCM 模式下使用 AES,这样您就不再需要 HMAC 了。不过,GCM(或 EAX)模式并不总是可用。
关于c# - 允许使用 AES 256 为 HMAC 解密任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9672910/