2018 年 1 月 16 日更新:Oracle 发布了 Java 8 u162。在此版本中,默认启用无限制策略。您不再需要在 JRE 中安装策略文件或设置安全属性crypto.policy
。
当您使用 Java Cryptography Extension (JCE) 时,您可能已经知道开箱即用的 Java 运行时对特定的密钥长度参数实施了限制。
当您查看以下使用 AES 加密和解密字符串的程序时,当您使用 128 位 ( keyGen.init(128, random);
)的密钥长度时,它可以正常工作。
byte[] input = "My super secret text".getBytes();
SecureRandom random = SecureRandom.getInstanceStrong();
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128, random);
SecretKey key = keyGen.generateKey();
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "SunJCE");
byte[] iv = new byte[12];
random.nextBytes(iv);
GCMParameterSpec spec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.ENCRYPT_MODE, key, spec);
byte[] cipherText = cipher.doFinal(input);
// Decrypt
cipher.init(Cipher.DECRYPT_MODE, key, spec);
byte[] plainText = cipher.doFinal(cipherText);
System.out.println(new String(plainText));
但是当您将密钥长度更改为 192 ( keyGen.init(192, random);
) 或 256 ( keyGen.init(256, random);
) 位时,java 运行时会抛出异常:
Exception in thread "main" java.security.InvalidKeyException: Illegal key size
要解决这个问题,你必须去这个网站,下载无限强度管辖权政策文件,解压,进入<java-home>/lib/security
目录,将两个文件local_policy.jar
和US_export_policy.jar
下载的两个文件替换。
通过此更改,您现在可以毫无例外地使用密钥大小为 192 和 256 的 AES。
此行为在Java 8的u151和u152版本中发生了变化。从该版本开始,不再需要从 Oracle 网站下载策略文件并进行安装。您现在可以使用此单行程序直接在您的应用程序中设置无限制策略:
Security.setProperty("crypto.policy", "unlimited");
确保在初始化 JCE 框架之前运行此代码。
或者,您可以在<jre_home>/lib/security/java.security
文件中设置无限制策略,而无需更改任何应用程序。搜索该行#crypto.policy=unlimited
并删除该#
字符以取消注释。
从Java 9 开始,该策略默认设置为无限制,因此当您使用最新的 Java 版本时,您无需更改任何内容或向程序添加任何代码。