Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Zip4J->;java.security.ProviderException:无法构造MacSpi实例_Java_Junit_Cryptography_Zip_Zip4j - Fatal编程技术网

Zip4J->;java.security.ProviderException:无法构造MacSpi实例

Zip4J->;java.security.ProviderException:无法构造MacSpi实例,java,junit,cryptography,zip,zip4j,Java,Junit,Cryptography,Zip,Zip4j,我正在尝试使用lingalazip4j来归档X509Certificate文件 然而,只有在使用Junit进行单元测试时,我才会遇到这种奇怪的异常 如果我将我的应用程序作为一个产品运行(这是一个SpringWeb应用程序),它可以正常工作,没有任何异常,并且我能够正确地归档和取消归档文件,没有任何问题 net.lingala.zip4j.exception.ZipException: java.security.ProviderException: Could not construct Mac

我正在尝试使用
lingalazip4j
来归档
X509Certificate
文件

然而,只有在使用
Junit
进行单元测试时,我才会遇到这种奇怪的异常

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

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)
    ... 
net.lingala.zip4j.exception.zipeexception:java.security.ProviderException:无法构造MacSpi实例
net.lingala.zip4j.crypto.aesencpyter.deriveKey(aesencpyter.java:116)
net.lingala.zip4j.crypto.aesencpyter.init(aesencpyter.java:89)
net.lingala.zip4j.crypto.aesencpyter.(aesencpyter.java:69)
位于net.lingala.zip4j.io.CipherOutputStream.initEncrypter(CipherOutputStream.java:173)
位于net.lingala.zip4j.io.CipherOutputStream.putnextry(CipherOutputStream.java:133)
位于net.lingala.zip4j.io.DeflaterOutputStream.putnextery(DeflaterOutputStream.java:45)
...
原因:java.security.ProviderException:无法构造MacSpi实例
在javax.crypto.Mac.chooseFirstProvider上(Mac.java:316)
位于javax.crypto.Mac.getMacLength(Mac.java:398)
位于net.lingala.zip4j.crypto.PBKDF2.MacBasedPRF(MacBasedPRF.java:45)
net.lingala.zip4j.crypto.PBKDF2.PBKDF2Engine.assertPRF(PBKDF2Engine.java:103)
net.lingala.zip4j.crypto.PBKDF2.PBKDF2Engine.deriveKey(PBKDF2Engine.java:66)
net.lingala.zip4j.crypto.aesencpyter.deriveKey(aesencpyter.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;
    }
}
import net.lingala.zip4j.exception.zipeexception;
导入net.lingala.zip4j.io.ZipOutputStream;
导入net.lingala.zip4j.model.zip参数;
导入net.lingala.zip4j.util.Zip4jConstants;
导入java.io.ByteArrayOutputStream;
导入java.io.File;
导入java.io.IOException;
导入java.security.cert.CertificateEncodingException;
导入java.security.cert.x509证书;
导入java.util.List;
导入java.util.UUID;
公共类ZiptStutils{
公共静态字节[]存档(列表证书列表、字符串密码)
抛出IOException、CertificateEncodingException、ZipException{
字节[]字节=null;
//-----加密参数(用于密码保护)--------
ZipParameters ZipParameters=getZipParameters(密码);
//--------------创建ZIP文件--------------------
ByteArrayOutputStream outputStream=新建ByteArrayOutputStream();
ZipOutputStream outputZipStream=新ZipOutputStream(outputStream);
//创建ZIP文件
对于(X509证书:证书列表){
如果(证书==null){
//跳过无效条目。
继续;
}
File File=File.createTempFile(UUID.randomUUID().toString(),“.cer”);
deleteOnExit()文件;
outputZipStream.putNextEntry(文件,zipParameters);
outputZipStream.write(CertificateTestUtils.encodeCertificate(certificate));
outputZipStream.closeEntry();
}
//结束
outputZipStream.finish();
字节=outputStream.toByteArray();
返回字节;
}
私有静态ZipParameters getZipParameters(字符串密码){
//创建压缩参数
ZipParameters ZipParameters=新的ZipParameters();
//设置加密文件的方式
zipParameters.SetCompression方法(Zip4jConstants.COMP_DEFLATE);
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
//将文件加密设置为true
zipParameters.setEncryptFiles(true);
//集合加密方法
zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
//设定关键强度
zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
//设置密码
zipParameters.setPassword(密码);
返回参数;
}
}
我正在使用Java1.6

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


注意:这仅在我使用Junit运行时发生…

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

我不知道为什么会这样。我能够通过使用反射创建模拟来克服这个问题,而不必使用
PowerMock


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

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

我不知道为什么会这样。我能够通过使用反射创建模拟来克服这个问题,而不必使用
PowerMock


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

添加此选项将有助于-@PowerMockIgnore({“javax.crypto.*})

有关更多信息,请参阅本文件-

添加此选项将有助于-@PowerMockIgnore({“javax.crypto.*})

有关更多信息,请参阅本文件-

欢迎shar,请在您的回答中添加您提供的链接的相关部分好吗?欢迎shar,请在您的回答中添加您提供的链接的相关部分好吗?