1

我想在 Java8中使用SunJCE 提供程序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;
};

我打电话时可以com.sun.crypto.provider.SunJCE在数组中看到Security.getProviders()

但是下面的代码抛出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 的任何想法?

4

2 回答 2

3

例外提到:

加密引发了异常。一个可能的原因是您正在使用强加密算法,并且您尚未在此 Java 虚拟机中安装 Java 加密扩展 (JCE) 无限强度管辖策略文件

这个答案只是试图解决这个问题。我已经写了另一个答案来帮助解决以下问题,因为它们完全不同。

如果您居住在允许使用它的国家/地区,您可以从Oracle 的网站上下载它。

然后,要安装这些无限强度的软件包,请进入您的$JAVA_HOME/jre/lib/security/文件夹(假设您有 JDK)。

在那里,备份你的local_policy.jarUS_export_policy.jar.

现在从您下载到该文件夹​​的 zip 文件中解压缩local_policy.jar和文件,然后重新启动您的应用程序。US_export_policy.jar您的应用程序现在可以访问无限强度的 JCE 功能。

如果出现任何问题,请将这两个文件恢复为其备份版本。

请注意,必须以这种方式“修补”每个必须运行此代码的 JVM。

于 2016-11-02T10:06:58.783 回答
2

很抱歉写另一个答案,但似乎自上一个答案以来我们已经取得了进展。现在的问题略有不同,但足以值得另一个答案。

正如您所说,您现在“仅”收到一条空的异常消息。

问题似乎在于算法:使用PBEWITHHMACSHA256ANDAES_256总是抛出异常。

这是因为 AES 需要额外的参数,即 IV。我发现Jasypt不支持IV

如果您想进一步使用该特定算法,我建议您在没有 Jasypt 的情况下手动实现它。上面的链接中有一个实现。

于 2016-11-02T11:06:35.477 回答