gpt4 book ai didi

java - PBE AES_256 加密在 java 8 u65 和 u71 之间不兼容

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:23 25 4
gpt4 key购买 nike

我使用 PBE AES_256 将一些文本加密并存储在数据库中。这最初是使用 java 1.8.0_65 完成的。升级到最新的 java 后,我无法再解密这些字段。我已指出与 1.8.0_71 的不兼容性。发行说明说明如下:

Problem with PBE algorithms using AES crypto corrected An error was corrected for PBE using 256-bit AES ciphers such that the derived key may be different and not equivalent to keys previously derived from the same password. JDK-8138589 (not public)

所以我假设我需要“手动”迁移这些字段值,方法是用旧版本解密,存储普通值,然后用当前版本重新加密。有没有更好的方法来做到这一点,或者我是否可能遗漏了有关这种不兼容性的一些信息?

这是用于加密的部分代码:

 SecretKey keyFromPassword =
SecretKeyFactory.getInstance(
algorithm).generateSecret(
new PBEKeySpec(password.toCharArray()));

Cipher cipher = Cipher.getInstance(algorithm);
cipher.init(Cipher.ENCRYPT_MODE, keyFromPassword, new PBEParameterSpec(
salt, iterations, new IvParameterSpec(iv)));
IOUtils.copyLarge(new CipherInputStream(clearStream, cipher), encryptedStream);

解决方案我能够通过对我的密码进行一些反射魔术并重新初始化它来解密现有值。如果有人感兴趣,这是代码:

Object spi = ReflectionTestUtils.getField(cipher, "spi");
ReflectionTestUtils.setField(spi, "keyLength", 128);
cipher.init(Cipher.DECRYPT_MODE, keyFromPassword, new PBEParameterSpec(
salt, iterations, new IvParameterSpec(iv)));

最佳答案

迁移字段值听起来是一种合理的方法。

查看 actual code changeJDK-8138589有关看起来并不太复杂。

区别似乎只是 key 长度。因此,即使在 1.8.0_71 之后的版本中,您也应该能够重现旧值。

如果您检测到使用旧 Java 版本创建但现在运行在"new"Java 版本上的值,您可以迁移它。已保存的附加字段表示迁移成功。

关于java - PBE AES_256 加密在 java 8 u65 和 u71 之间不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38393167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com