如何使用 JCE 的 PBEWITHHMACSHA256ANDAES_256 算法
How to use PBEWITHHMACSHA256ANDAES_256 algorithm from JCE
我想使用 Java8 中 SunJCE provider 的 PBEWITHHMACSHA256ANDAES_256
算法。
看起来罐子和所有配置在 Java8 中都是开箱即用的,但我无法使用 PBEWITHHMACSHA256ANDAES_256
算法。
我有这两个罐子:
jdk1.8.0_40\jre\lib\jce.jar
jdk1.8.0_40\jre\lib\ext\sunjce_provider.jar
jdk1.8.0_40\jre\lib\security\java.security
中有此条目
security.provider.5=com.sun.crypto.provider.SunJCE
jdk1.8.0_40\jre\lib\security\java.policy
中有此条目
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
当我调用Security.getProviders()
时,我可以在数组中看到com.sun.crypto.provider.SunJCE
但是下面的代码抛出EncryptionOperationNotPossibleException
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
import org.junit.Assert;
import org.junit.Test;
public class EncryptionTest {
@Test
public void test() {
SimpleStringPBEConfig pbeConfig = new SimpleStringPBEConfig();
pbeConfig.setAlgorithm("PBEWITHHMACSHA256ANDAES_256");
pbeConfig.setPassword("changeme");
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setConfig(pbeConfig);
String encrypted = encryptor.encrypt("foo");
String decrypted = encryptor.decrypt(encrypted);
Assert.assertEquals("foo", decrypted);
}
}
异常
org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:999)
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.java:868)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:642)
at foo.bar.EncryptionTest.test(EncryptionTest.java:40)
知道为什么 PBEWITHHMACSHA256ANDAES_256 会抛出 EncryptionOperationNotPossibleException 吗?
异常提到:
Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
此答案仅尝试修复那个问题。我写了 来帮助解决以下问题,因为它们完全不同。
如果您居住的国家/地区允许,您可以前往 Oracle's website 下载。
然后,要安装这些无限强度的软件包,请进入您的 $JAVA_HOME/jre/lib/security/
文件夹(假设您有一个 JDK)。
在那里,备份你的 local_policy.jar
和 US_export_policy.jar
。
现在将您下载的 zip 文件中的 local_policy.jar
和 US_export_policy.jar
文件解压缩到该文件夹中,然后重新启动您的应用程序。您的应用程序现在可以访问无限强度的 JCE 功能。
如果出现任何问题,将这两个文件恢复到它们的备份版本。
请注意,每个需要 运行 此代码的 JVM 都必须 "patched" 这种方式。
很抱歉写 另一个 答案,但自上一个答案以来我们似乎取得了进步。问题现在略有不同,但足以值得另一个答案。
正如您所说,您现在 "only" 收到一条空异常消息。
问题似乎出在算法上:使用 PBEWITHHMACSHA256ANDAES_256
总是会抛出异常。
这是因为 AES 需要额外的参数,即 IV。我发现 .
如果您想进一步使用该特定算法,我建议您在不使用 Jasypt 的情况下手动实现它。上述 link.
中有一个实现
我想使用 Java8 中 SunJCE provider 的 PBEWITHHMACSHA256ANDAES_256
算法。
看起来罐子和所有配置在 Java8 中都是开箱即用的,但我无法使用 PBEWITHHMACSHA256ANDAES_256
算法。
我有这两个罐子:
jdk1.8.0_40\jre\lib\jce.jar
jdk1.8.0_40\jre\lib\ext\sunjce_provider.jar
jdk1.8.0_40\jre\lib\security\java.security
security.provider.5=com.sun.crypto.provider.SunJCE
jdk1.8.0_40\jre\lib\security\java.policy
grant codeBase "file:${{java.ext.dirs}}/*" {
permission java.security.AllPermission;
};
当我调用Security.getProviders()
com.sun.crypto.provider.SunJCE
但是下面的代码抛出EncryptionOperationNotPossibleException
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.jasypt.exceptions.EncryptionOperationNotPossibleException;
import org.junit.Assert;
import org.junit.Test;
public class EncryptionTest {
@Test
public void test() {
SimpleStringPBEConfig pbeConfig = new SimpleStringPBEConfig();
pbeConfig.setAlgorithm("PBEWITHHMACSHA256ANDAES_256");
pbeConfig.setPassword("changeme");
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setConfig(pbeConfig);
String encrypted = encryptor.encrypt("foo");
String decrypted = encryptor.decrypt(encrypted);
Assert.assertEquals("foo", decrypted);
}
}
异常
org.jasypt.exceptions.EncryptionOperationNotPossibleException: Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.handleInvalidKeyException(StandardPBEByteEncryptor.java:999)
at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.encrypt(StandardPBEByteEncryptor.java:868)
at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.encrypt(StandardPBEStringEncryptor.java:642)
at foo.bar.EncryptionTest.test(EncryptionTest.java:40)
知道为什么 PBEWITHHMACSHA256ANDAES_256 会抛出 EncryptionOperationNotPossibleException 吗?
异常提到:
Encryption raised an exception. A possible cause is you are using strong encryption algorithms and you have not installed the Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files in this Java Virtual Machine
此答案仅尝试修复那个问题。我写了
如果您居住的国家/地区允许,您可以前往 Oracle's website 下载。
然后,要安装这些无限强度的软件包,请进入您的 $JAVA_HOME/jre/lib/security/
文件夹(假设您有一个 JDK)。
在那里,备份你的 local_policy.jar
和 US_export_policy.jar
。
现在将您下载的 zip 文件中的 local_policy.jar
和 US_export_policy.jar
文件解压缩到该文件夹中,然后重新启动您的应用程序。您的应用程序现在可以访问无限强度的 JCE 功能。
如果出现任何问题,将这两个文件恢复到它们的备份版本。
请注意,每个需要 运行 此代码的 JVM 都必须 "patched" 这种方式。
很抱歉写 另一个 答案,但自上一个答案以来我们似乎取得了进步。问题现在略有不同,但足以值得另一个答案。
正如您所说,您现在 "only" 收到一条空异常消息。
问题似乎出在算法上:使用 PBEWITHHMACSHA256ANDAES_256
总是会抛出异常。
这是因为 AES 需要额外的参数,即 IV。我发现
如果您想进一步使用该特定算法,我建议您在不使用 Jasypt 的情况下手动实现它。上述 link.
中有一个实现