2016-04-04 12 views
0

Ich versuche Lingala zip4j zu verwenden, um X509Certificate-Dateien zu archivieren.Zip4J -> java.security.ProviderException: Konnte keine MacSpi-Instanz erstellen

aber ich bekomme diese seltsame Ausnahme nur, wenn ich mit Junit Unit-Tests bin.

Wenn ich meine Anwendung regelmäßig (das ist eine Spring-Web-App) läuft alles in allem gut funktioniert ohne Ausnahmen und ich bin in der Lage, Dateien ordnungsgemäß und ohne Probleme zu archivieren und zu entpacken.

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) 
    ... 

Hier Code mein utils die certs zu archivieren, die ich verwendet habe:

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; 
    } 
} 

ich Java 1.6

bin mit habe ich auch versucht, 1.8, aber immer das gleiche mit Error.

Hinweis: dies nur geschieht, wenn ich mit Junit laufen ...

Antwort

1

Ich fand heraus, dass die Tests mit PowerMockRunner.class läuft dieses Problem verursacht auftreten.

Nicht sicher, warum genau, aber ich war in der Lage, meine Mocks mit Reflektion zu schaffen, ohne PowerMock verwenden zu müssen.

Ich habe das unmittelbare Problem, das ich hatte, gelöst, aber das ist ein sehr seltsames Problem, und wenn jemand weiß, warum das passiert, würde ich immer noch wissen wollen.