具有恒定盐的 AES 加密的安全性
本文关键字:AES 安全性 加密 | 更新日期: 2023-09-27 18:32:44
我有一个用 C# 编写的编码应用程序,用户可以在其中选择性地加密消息。我一直在这个答案中使用这个类,事实证明我是一个很好的公司,因为我在网上找到了几个使用完全相同代码的地方(其中一个是 Netflix 的开源平台(。
然而,对该答案的评论(以及后来对该答案的编辑(使我相信这种方法是不安全的。我选择在这个答案中使用同一问题的类。
如果您使用恒定盐,AES 加密的安全性如何?这种方法有多容易被打破?我承认我在这方面的经验很少。
AES 是一种分组密码。分组密码的输入是一个密钥和一个明文块。分组密码通常用于分组密码操作模式。所有安全操作模式都使用初始化向量或 IV。否则,相同的明文将加密为相同的密文(对于相同的密钥(,这是泄漏信息。
AES 或操作模式不使用盐。它通常用作密钥派生函数 (KDF( 的输入,尤其是基于密码的密钥派生函数 (PBKDF(。Dot NET的Rfc2898DeriveBytes
实现了PBKDF2函数,如RFC 2898:"PKCS #5:基于密码的密码学规范版本2.0"中所定义的那样。
如果在 PBKDF2 中使用静态盐,那么您将获得与输出相同的键(迭代次数相同(。现在,如果您泄露了生成的密钥,那么您的所有密文都将容易受到攻击。如果您使用多个密码,那么攻击者将能够构建彩虹表;PBKDF2工作因子将变得不那么重要;攻击者只需构建一个表,然后在所有可能的密文上尝试所有生成的密钥。
因此,由于盐实际上并未用于AES,因此对安全性没有太大影响。然而,这仍然是一个可怕的罪过,甚至比使用 PBKDF2/Rfc2898DeriveBytes
的默认迭代计数更糟糕。
请注意,可怕的安全罪每天都是由许多人犯下的。有很多很多人犯错并不能告诉你你在"好公司"里。有 289 个赞成票只是告诉你,关于密码学的 SO 答案不应该根据票数来信任。
盐的存在是有原因的。这使得相同的输入能够以不同的方式加密。如果攻击者真的坚持,他可以找到一些在没有盐的情况下在加密中重复的模式,最终可以更容易地获取您的密钥。尽管如此,attcker仍然必须非常努力地工作。使用恒定盐等于根本不使用盐。强烈建议使用它,因为它对解密过程没有影响。