Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PBE AES_256加密在java 8 u65和u71之间不兼容_Java_Encryption_Aes - Fatal编程技术网

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
对一些文本进行了加密并存储在数据库中。这最初是使用java
1.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。详情请参阅。谢谢,我已经在看了。我还将在原始问题中提供一个代码片段。如果您将您的解决方案作为答案发布会更好