确认

  • [X] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
  • [ ] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

功能改进

AES.java#L50 中加密时使用的IV与Key一致,这削弱了AES的安全性,可能受到 已知明文攻击(Known-Plaintext Attack, KPA) 改进建议: 每次加密时,都应该生成一个随机的 IV。这个 IV 可以和密文一起传输,因为它不需要保密,但它必须是唯一的。 IV 和密钥必须是完全独立的,绝对不能使用相同的数据。IV 的作用是增强加密的随机性,而密钥的作用是保证加密的安全性。

参考资料

No response

Comment From: DeH40

补充:我发现在 #6262 中有人提出过相关问题,但被标记为 wontfix , 可否给出对此问题不修复的更多解释?谢谢。

Comment From: Zarek-Xeons

我看了下官方文档的使用手册:

// 生成 16 位随机 AES 密钥
String randomKey = AES.generateRandomKey();

// 随机密钥加密
String result = AES.encrypt(data, randomKey);

密钥已经是随机生成的,理论上讲,如果没有重复使用这个密钥加密的话是可以避免已知明文攻击的。所以针对这个问题的最佳实践应该是不要重复使用这个随机密钥,如果有多个字段需要加密,生成多个不同随机密钥进行加密并保管。

然而这并不是一个推荐做法,推荐做法还是从加密方法下手,每次调用加密方法时都要生成随机iv并附到密文里,在解密时取出随机iv并解密;而不是将密钥随机化,密钥应该是固定的。

而且我看了下这个工具类的应用,应该是用于数据库配置文件加密,而且密钥传入只能传入一个

// Jar 启动参数( idea 设置 Program arguments , 服务器可以设置为启动环境变量 )
--mpw.key=xxxxxxxx

所以如果你的数据库配置文件有相同的值,那么密文也会是相同的,攻击者可以推断出密文的模式,所以还是有风险,建议修改。