PBE AES_256加密在java 8 u65和u71之间不兼容
我使用PBE AES_256加密在java 8 u65和u71之间不兼容,java,encryption,aes,Java,Encryption,Aes,我使用PBE AES_256对一些文本进行了加密并存储在数据库中。这最初是使用java1.8.0_65完成的。升级到最新的java后,我无法再解密这些字段。我已经指出了与1.8.071的不兼容性。发行说明说明如下: 使用AES加密纠正PBE算法的问题 使用256位AES密码为PBE更正了一个错误,因此派生密钥可能不同于先前从相同密码派生的密钥。 JDK-8138589(非公开) 因此,我假设我需要“手动”迁移这些字段值,方法是使用旧版本解密,存储普通值,然后使用当前版本重新加密。是否有更好的方法
PBE AES_256
对一些文本进行了加密并存储在数据库中。这最初是使用java1.8.0_65
完成的。升级到最新的java后,我无法再解密这些字段。我已经指出了与1.8.071
的不兼容性。发行说明说明如下:
使用AES加密纠正PBE算法的问题
使用256位AES密码为PBE更正了一个错误,因此派生密钥可能不同于先前从相同密码派生的密钥。
JDK-8138589(非公开)
因此,我假设我需要“手动”迁移这些字段值,方法是使用旧版本解密,存储普通值,然后使用当前版本重新加密。是否有更好的方法来实现这一点,或者我是否遗漏了与此不兼容相关的内容
以下是用于加密的部分代码:
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)));
迁移字段值听起来是一种合理的方法 查看相关的文档看起来并不太复杂 区别似乎只是关键的长度。因此,即使在1.8.0_71之后的版本上,您也应该能够复制旧值
如果您检测到一个使用旧Java版本创建的值,但现在在“新”Java版本上运行,您可以迁移它。成功的迁移由和保存的其他字段指示。谢谢。我不知道如何在版本71+上复制旧值。我可以在
PBEParameterSpec
中手动设置密钥长度吗?您没有提供如何加密的代码,因此我不知道您使用的是什么代码。我假设您必须手动生成密钥和en/decrypt。详情请参阅。谢谢,我已经在看了。我还将在原始问题中提供一个代码片段。如果您将您的解决方案作为答案发布会更好