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

时间:2016-07-15 09:55:48

标签: java encryption aes

我使用- (CGSize ) messageSizeExact:(UILabel *) msgLabel { CGRect textRect = [msgLabel.text boundingRectWithSize:(CGSize){280.0, CGFLOAT_MAX} options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:msgLabel.font} context:nil]; return textRect.size; } 将一些文本加密并存储在数据库中。这最初是使用java PBE AES_256完成的。升级到最新的java后,我无法解密这些字段。我已经确定了1.8.0_65的不兼容性。发行说明说明如下:

  

使用AES加密校正的PBE算法的问题   使用256位AES密码更正了PBE的错误,使得派生密钥可能不同,并且不等同于先前从相同密码派生的密钥。   JDK-8138589(非公开)

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

以下是用于加密的代码的一部分:

1.8.0_71

解决方案 通过在我的密码上做一些反射魔法并重新初始化它,我能够解密现有的值。如果有人有兴趣,这是代码:

 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);

1 个答案:

答案 0 :(得分:4)

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

查看与actual code change相关的JDK-8138589看起来并不太复杂。

差异似乎只是关键长度。因此,即使在1.8.0_71之后的版本上,您也应该能够重现旧值。

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