我使用- (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);
答案 0 :(得分:4)
迁移字段值听起来像是一种合理的方法。
查看与actual code change相关的JDK-8138589看起来并不太复杂。
差异似乎只是关键长度。因此,即使在1.8.0_71之后的版本上,您也应该能够重现旧值。
如果您检测到使用旧Java版本创建的值,但现在正在" new"您可以迁移它的Java版本。成功的迁移由保存的附加字段表示。