使用较新算法时 Jasypt 解密 EncryptionOperationNotPossibleException
Jasypt decryption EncryptionOperationNotPossibleException while using newer algorithms
我正在使用 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.
Jasypt 中似乎有一个错误,可以找到详细信息here。即使提供了补丁,我也找不到发布的二进制文件。
bug for Jasypt has been reported 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>
我正在使用 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.
Jasypt 中似乎有一个错误,可以找到详细信息here。即使提供了补丁,我也找不到发布的二进制文件。
bug for Jasypt has been reported 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>