c# - 允许使用 AES 256 为 HMAC 解密任何数据

标签 c# security encryption hash hmac

考虑一个将由我将编写的 C# 库加密的文件,其中包含一个 64 字节的 HMAC,紧接着是用 AES 256 加密的加密数据。16 字节的 IV、32 字节的 key 和 64 字节的HMACSHA512 初始化 key 将通过单个字符串密码来自 Rfc2898DeriveBytes,由用户输入(4096 次迭代,以及来自 random.org 的单个盐)。

  1. 这种设计是否有任何负面的安全隐患?

  2. 我是不是做得太过了? (它,用 64 字节的初始化 key 或 4096 次迭代)

  3. 我希望能够解密任何数据,以便使用嵌入式 HMAC 验证密码是否正确(即“解密文件是原始文件”)。具体来说,我希望避免诸如“填充无效且无法删除”之类的错误。关于如何解决这个问题有什么想法吗?

最佳答案

  1. 是的,IV 应该放在密文的前面并且应该是随机的。如果您使用 Rfc2898DeriveBytes,您每次都会获得相同的 IV,因此加密不同的纯文本将导致相同的密文,从而泄露信息。

  2. 是的,64 字节的初始化 key 有点多。 16 到 32 个字节应该绰绰有余。也就是说,它对性能没有太大影响,所以...4Ki 迭代很好(为什么不只是 4000,算法不会改变)。

  3. 是的,将 HMAC 置于加密数据之上,并确保在解密(最后一个 block )之前验证 HMAC。通常 HMAC 位于密文之后(因为流式实现只有在加密所有密文后才知道 HMAC)。

或者,您可以在 GCM 模式下使用 AES,这样您就不再需要 HMAC 了。不过,GCM(或 EAX)模式并不总是可用。

关于c# - 允许使用 AES 256 为 HMAC 解密任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9672910/

相关文章:

ios - 我可以检查用户是否设置了密码吗?

java - 在生产服务器上启用 jmx(lambda 探针)是个好主意吗?

python - 原子替换多个字符

c# - 同一模块在 .net 核心上的 AppDomain 中加载了两次

c# - 通用纯文本 linting 工具

c# - 跨多个程序集实现分部方法

java - 使用 char[] 生成 MD5 哈希

java - Cipher.unwrap() key 长度 Sun - BouncyCaSTLe 兼容性

java - Android中音频文件的AES 256加密和解密

c# - “If” 条件是否比 ??和类型转换