是否有任何方法可以在不试图解压的情况下使用zip4j库检查zip文件中的密码更正?
问候
发布于 2013-10-08 11:19:19
不幸的是,在当前版本的Zip4j中,这是不可能的。我目前正在重写Zip4j,我将在下一个版本中包含这个特性。
但是,对于当前的版本,有一个解决办法。请看下面的代码。您可以尝试将zip文件读入内存。对于AES加密的压缩文件,您将立即得到一个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();
}
}https://stackoverflow.com/questions/19244137
复制相似问题