2013-10-08 148 views

回答

2

不幸的是,這是不能直接與Zip4j的當前版本。我現在正在重寫Zip4j,我將在下一個版本中包含此功能。

但是,在當前版本中,有一個解決方法。看看下面的代碼。您可以嘗試將zip文件讀入內存。對於AES加密的zip文件,您將立即得到ZipException並帶有代碼ZipExceptionConstants.WRONG_PASSWORD。對於標準郵政編碼加密,驗證密碼並不容易。如果輸入的密碼錯誤,Zip4j會拋出CRC異常,這很可能意味着密碼錯誤,但也可能是zip文件中的損壞數據。我知道下面的代碼不是乾淨的代碼,但不幸的是,是目前唯一的方法。 Zip4j的下一個版本將包括一個整潔的功能來驗證密碼。

import java.io.File; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.List; 

import net.lingala.zip4j.core.ZipFile; 
import net.lingala.zip4j.exception.ZipException; 
import net.lingala.zip4j.exception.ZipExceptionConstants; 
import net.lingala.zip4j.model.FileHeader; 

public class VerifyPassword { 

    public static void verify() { 
     try { 
      ZipFile zipFile = new ZipFile(new File("myZip.zip")); 
      if (zipFile.isEncrypted()) { 
       zipFile.setPassword(new char[] {'t', 'e', 's', 't'}); 
      } 
      List<FileHeader> fileHeaders = zipFile.getFileHeaders(); 

      for(FileHeader fileHeader : fileHeaders) { 
       try { 
        InputStream is = zipFile.getInputStream(fileHeader); 
        byte[] b = new byte[4 * 4096]; 
        while (is.read(b) != -1) { 
         //Do nothing as we just want to verify password 
        } 
        is.close(); 
       } catch (ZipException e) { 
        if (e.getCode() == ZipExceptionConstants.WRONG_PASSWORD) { 
         System.out.println("Wrong password"); 
        } else { 
         //Corrupt file 
         e.printStackTrace(); 
        } 
       } catch (IOException e) { 
        System.out.println("Most probably wrong password."); 
        e.printStackTrace(); 
       } 
      } 

     } catch (Exception e) { 
      System.out.println("Some other exception occurred"); 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     verify(); 
    } 

} 
+0

Hi Srikanth,有點偏離主題,但zip4j支持哪些加密格式?它比標準的zip庫更多嗎?我有一堆加密的拉鍊與未知的算盤。 – tom

+0

當您編寫標準的zip庫時,假定您的意思是JRE的內置zip(java.util.zip),則此庫不支持任何加密。 Zip4j支持AES以及標準zip加密 – SrikanthLingala

+0

歡呼的回覆。我會檢查出來的。 – tom

相關問題