kpe*_*hev 11 java encryption aes
我有一些文本加密并存储在数据库中使用PBE AES_256.这最初是使用java完成的1.8.0_65.升级到最新的java后,我无法解密这些字段.我已经确定了与之不兼容的问题1.8.0_71.发行说明声明如下:
使用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);
Run Code Online (Sandbox Code Playgroud)
解决方案 我能够通过在我的密码上做一些反射魔法并重新初始化来解密现有值.如果有人有兴趣,这是代码:
Object spi = ReflectionTestUtils.getField(cipher, "spi");
ReflectionTestUtils.setField(spi, "keyLength", 128);
cipher.init(Cipher.DECRYPT_MODE, keyFromPassword, new PBEParameterSpec(
salt, iterations, new IvParameterSpec(iv)));
Run Code Online (Sandbox Code Playgroud)
迁移字段值听起来是一个合理的方法。
查看与JDK-8138589相关的实际代码更改看起来并不太复杂。
区别似乎只是密钥长度。因此,即使在 1.8.0_71 之后的版本上,您也应该能够重现旧值。
如果您检测到使用旧 Java 版本创建但现在在“新”Java 版本上运行的值,您可以迁移它。成功的迁移由保存的附加字段指示。