gpt4 book ai didi

java - Zip4J -> java.security.ProviderException : Could not construct MacSpi instance

转载 作者:行者123 更新时间:2023-12-01 21:41:19 26 4
gpt4 key购买 nike

我正在尝试使用 lingala zip4j 来存档 X509Certificate 文件。

但是,只有当我使用 Junit 进行单元测试时,我才会遇到这个奇怪的异常。

如果我将我的应用程序作为产品运行(这是一个 Spring Web 应用程序) - 它工作正常,没有异常(exception),并且我能够正确归档和取消归档文件,没有任何问题。

net.lingala.zip4j.exception.ZipException: java.security.ProviderException: Could not construct MacSpi instance

at net.lingala.zip4j.crypto.AESEncrpyter.deriveKey(AESEncrpyter.java:116)
at net.lingala.zip4j.crypto.AESEncrpyter.init(AESEncrpyter.java:89)
at net.lingala.zip4j.crypto.AESEncrpyter.<init>(AESEncrpyter.java:69)
at net.lingala.zip4j.io.CipherOutputStream.initEncrypter(CipherOutputStream.java:173)
at net.lingala.zip4j.io.CipherOutputStream.putNextEntry(CipherOutputStream.java:133)
at net.lingala.zip4j.io.DeflaterOutputStream.putNextEntry(DeflaterOutputStream.java:45)
...

Caused by: java.security.ProviderException: Could not construct MacSpi instance
at javax.crypto.Mac.chooseFirstProvider(Mac.java:316)
at javax.crypto.Mac.getMacLength(Mac.java:398)
at net.lingala.zip4j.crypto.PBKDF2.MacBasedPRF.<init>(MacBasedPRF.java:45)
at net.lingala.zip4j.crypto.PBKDF2.PBKDF2Engine.assertPRF(PBKDF2Engine.java:103)
at net.lingala.zip4j.crypto.PBKDF2.PBKDF2Engine.deriveKey(PBKDF2Engine.java:66)
at net.lingala.zip4j.crypto.AESEncrpyter.deriveKey(AESEncrpyter.java:113)
...

这是我的 Utils 代码,它存档了我使用过的证书:

import net.lingala.zip4j.exception.ZipException;
import net.lingala.zip4j.io.ZipOutputStream;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.util.Zip4jConstants;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.List;
import java.util.UUID;

public class ZipTestUtils {

public static byte[] archive(List<X509Certificate> certificateList, String password)
throws IOException, CertificateEncodingException, ZipException {

byte[] bytes = null;

// --------Encryption zipParameters (for password protection)--------
ZipParameters zipParameters = getZipParameters(password);

// -------------------- CREATE ZIP file --------------------
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ZipOutputStream outputZipStream = new ZipOutputStream(outputStream);

// Create ZIP file
for (X509Certificate certificate : certificateList) {
if (certificate == null) {
// skip invalid entries.
continue;
}

File file = File.createTempFile(UUID.randomUUID().toString(), ".cer");
file.deleteOnExit();

outputZipStream.putNextEntry(file, zipParameters);
outputZipStream.write(CertificateTestUtils.encodeCertificate(certificate));
outputZipStream.closeEntry();
}

//finish up
outputZipStream.finish();

bytes = outputStream.toByteArray();


return bytes;
}

private static ZipParameters getZipParameters(String password) {
// Create ZipParameters
ZipParameters zipParameters = new ZipParameters();

// Set how you want to encrypt files
zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);

// Set encryption of files to true
zipParameters.setEncryptFiles(true);

// Set encryption method
zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
// Set key strength
zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);

// Set password
zipParameters.setPassword(password);
return zipParameters;
}
}

我使用的是 Java 1.6

我也尝试过使用 1.8,但遇到了同样的错误。

注意:只有当我使用 Junit 运行时才会发生这种情况...

最佳答案

我发现使用 PowerMockRunner.class 运行测试会导致出现此问题。

我不知道为什么会出现这种情况。我能够通过使用反射创建模拟来克服这个问题,而无需使用 PowerMock

我已经解决了我遇到的直接问题,但这是一个非常奇怪的问题,如果有人知道为什么会发生这种情况,我仍然想知道。

关于java - Zip4J -> java.security.ProviderException : Could not construct MacSpi instance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36404160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com