Jasypt解密EncryptionOperationNotPossibleException同时使用更新的算法

时间:2018-03-26 12:12:31

标签: java password-encryption jasypt

我正在使用Jasypt API(版本1.9.2)进行加密和解密。在使用命令行界面工具列出算法时,我得到以下列表。

listAlgorithms.bat

PBE ALGORITHMS:      [PBEWITHHMACSHA1ANDAES_128, 
PBEWITHHMACSHA1ANDAES_256, 
PBEWITHHMACSHA224ANDAES_128, 
PBEWITHHMACSHA224ANDAES_256, 
PBEWITHHMACSHA256ANDAES_128, 
PBEWITHHMACSHA256ANDAES_256, 
PBEWITHHMACSHA384ANDAES_128, 
PBEWITHHMACSHA384ANDAES_256,
PBEWITHHMACSHA512ANDAES_128, 
PBEWITHHMACSHA512ANDAES_256, 
PBEWITHMD5ANDDES, 
PBEWITHMD5ANDTRIPLEDES, 
PBEWITHSHA1ANDDESEDE, 
PBEWITHSHA1ANDRC2_128, 
PBEWITHSHA1ANDRC2_40, 
PBEWITHSHA1ANDRC4_128, 
PBEWITHSHA1ANDRC4_40]

但是,当我使用以下任何算法(上面列出的那些算法)加密和解密文本时,加密工作正常,但解密失败。

PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256

以下是代码段

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("9daed9cd-e828-485f-a0a9-c63cfc364f4b");
encryptor.setAlgorithm("PBEWITHHMACSHA1ANDAES_256");
String input = "secret";
String enc = encryptor.encrypt(input);
System.out.println("Enc String: "+enc);
String dec = encryptor.decrypt(enc); //line 17 in the code where exception is thrown
System.out.println("Dec String: "+dec);

这是我在尝试解密加密文本时遇到的异常。

Enc String: +APh51ggjCYY/UX92dJ4QmD52lMyTTJ7btqClF2EGT8=
Exception in thread "main" org.jasypt.exceptions.EncryptionOperationNotPossibleException
    at org.jasypt.encryption.pbe.StandardPBEByteEncryptor.decrypt(StandardPBEByteEncryptor.java:1055)
    at org.jasypt.encryption.pbe.StandardPBEStringEncryptor.decrypt(StandardPBEStringEncryptor.java:725)
    at com.trimble.space.management.tpass.utilization.encryption.BasisTextCodec.main(BasisTextCodec.java:17)

在做了一些测试后,我发现Jasypt不支持以下算法列表,它会抛出上面提到的运行时异常。

PBEWITHHMACSHA1ANDAES_128, 
PBEWITHHMACSHA1ANDAES_256, 
PBEWITHHMACSHA224ANDAES_128, 
PBEWITHHMACSHA224ANDAES_256, 
PBEWITHHMACSHA256ANDAES_128, 
PBEWITHHMACSHA256ANDAES_256, 
PBEWITHHMACSHA384ANDAES_128, 
PBEWITHHMACSHA384ANDAES_256, 
PBEWITHHMACSHA512ANDAES_128, 
PBEWITHHMACSHA512ANDAES_256

但是下面的算法运行正常,没有给出任何运行时异常。

PBEWITHMD5ANDDES, 
PBEWITHMD5ANDTRIPLEDES, 
PBEWITHSHA1ANDDESEDE, 
PBEWITHSHA1ANDRC2_128, 
PBEWITHSHA1ANDRC2_40, 
PBEWITHSHA1ANDRC4_128, 
PBEWITHSHA1ANDRC4_40

以下是生成受支持且不受支持的算法列表的测试。

@Test
    public void test() {
        Set<String> supported = new HashSet<>();
        Set<String> unsupported = new HashSet<>();
        for (Object algorithms : AlgorithmRegistry.getAllPBEAlgorithms()) {
            String algo = (String) algorithms;
            try {
                StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
                encryptor.setAlgorithm(algo);
                encryptor.setPassword("secret");
                String encrypted = encryptor.encrypt("foo");
                String decrypted = encryptor.decrypt(encrypted);
                Assert.assertEquals("foo", decrypted);
                supported.add(algo);
            } catch (EncryptionOperationNotPossibleException e) {
                unsupported.add(algo);
            }
        }
        System.out.println("Supported");
        supported.forEach((String name) -> System.out.println("   " + name)); 
        System.out.println("Unsupported");
        unsupported.forEach((String name) -> System.out.println("   " + name)); 
    }

http://www.jasypt.org/encrypting-texts.html

这似乎是Jasypt代码中的一个错误,这里是discussion thread.

2 个答案:

答案 0 :(得分:4)

Jasypt似乎有一个错误,可以找到详细信息here。即使提供了补丁,我也找不到发布的二进制文件。

答案 1 :(得分:3)

已报告bug用于Jasypt的here

您可以找到修补的版本here on GitHub,并使用mvn clean package进行构建。

https://github.com/melloware/jasypt

我在JDK 8补丁162或更高版本中使用了此版本,它可以很好地工作,并且所有高级加密(如PBEWITHHMACSHA512ANDAES_256)都可以直接使用。

我已经以以下方式部署到Maven Central:

<dependency>
  <groupId>com.melloware</groupId>
  <artifactId>jasypt</artifactId>
  <version>1.9.4</version>
</dependency>