Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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
Java 使用zip4j检查zip文件中的密码更正_Java_Zip - Fatal编程技术网

Java 使用zip4j检查zip文件中的密码更正

Java 使用zip4j检查zip文件中的密码更正,java,zip,Java,Zip,使用Java中的zip4j库检查zip文件中的密码更正,而不尝试解压缩zip,有什么方法吗 关于不幸的是,这在当前版本的Zip4j中不可能直接实现。我目前正在重写Zip4j,我将在下一个版本中包含此功能 但是,对于当前版本,有一个解决方法。看看下面的代码。您可以尝试将zip文件读入内存。对于AES加密的zip文件,您将立即得到一个ZipException和一个代码ZipExceptionConstants.Error_PASSWORD。对于标准的zip加密,验证密码并不容易。如果输入密码错误,Z

使用Java中的zip4j库检查zip文件中的密码更正,而不尝试解压缩zip,有什么方法吗


关于

不幸的是,这在当前版本的Zip4j中不可能直接实现。我目前正在重写Zip4j,我将在下一个版本中包含此功能

但是,对于当前版本,有一个解决方法。看看下面的代码。您可以尝试将zip文件读入内存。对于AES加密的zip文件,您将立即得到一个ZipException和一个代码
ZipExceptionConstants.Error_PASSWORD
。对于标准的zip加密,验证密码并不容易。如果输入密码错误,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();
    }

}
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.List;
导入net.lingala.zip4j.core.ZipFile;
导入net.lingala.zip4j.exception.zipeexception;
导入net.lingala.zip4j.exception.ZipExceptionConstants;
导入net.lingala.zip4j.model.FileHeader;
公共类验证密码{
公共静态void verify(){
试一试{
ZipFile ZipFile=新ZipFile(新文件(“myZip.zip”);
if(zipFile.isEncrypted()){
setPassword(新字符[]{'t','e','s','t'});
}
List fileHeaders=zipFile.getFileHeaders();
for(FileHeader FileHeader:fileHeaders){
试一试{
InputStream=zipFile.getInputStream(文件头);
字节[]b=新字节[4*4096];
while(is.read(b)!=-1){
//什么也不做,因为我们只想验证密码
}
is.close();
}捕获(ZipException e){
如果(e.getCode()==ZipExceptionConstants.密码错误){
System.out.println(“错误密码”);
}否则{
//损坏的文件
e、 printStackTrace();
}
}捕获(IOE异常){
System.out.println(“很可能是错误的密码”);
e、 printStackTrace();
}
}
}捕获(例外e){
System.out.println(“发生了一些其他异常”);
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
验证();
}
}

不幸的是,这在当前版本的Zip4j中无法直接实现。我目前正在重写Zip4j,我将在下一个版本中包含此功能

但是,对于当前版本,有一个解决方法。看看下面的代码。您可以尝试将zip文件读入内存。对于AES加密的zip文件,您将立即得到一个ZipException和一个代码
ZipExceptionConstants.Error_PASSWORD
。对于标准的zip加密,验证密码并不容易。如果输入密码错误,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();
    }

}
导入java.io.File;
导入java.io.IOException;
导入java.io.InputStream;
导入java.util.List;
导入net.lingala.zip4j.core.ZipFile;
导入net.lingala.zip4j.exception.zipeexception;
导入net.lingala.zip4j.exception.ZipExceptionConstants;
导入net.lingala.zip4j.model.FileHeader;
公共类验证密码{
公共静态void verify(){
试一试{
ZipFile ZipFile=新ZipFile(新文件(“myZip.zip”);
if(zipFile.isEncrypted()){
setPassword(新字符[]{'t','e','s','t'});
}
List fileHeaders=zipFile.getFileHeaders();
for(FileHeader FileHeader:fileHeaders){
试一试{
InputStream=zipFile.getInputStream(文件头);
字节[]b=新字节[4*4096];
while(is.read(b)!=-1){
//什么也不做,因为我们只想验证密码
}
is.close();
}捕获(ZipException e){
如果(e.getCode()==ZipExceptionConstants.密码错误){
System.out.println(“错误密码”);
}否则{
//损坏的文件
e、 printStackTrace();
}
}捕获(IOE异常){
System.out.println(“很可能是错误的密码”);
e、 printStackTrace();
}
}
}捕获(例外e){
System.out.println(“发生了一些其他异常”);
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
验证();
}
}

Hi Srikanth,有点离题,但zip4j支持什么加密格式?它是否比标准的zip库更多?我有一堆未知算法的加密zip。假设您在编写标准zip库时是指JRE的内置zip(java.util.zip),该库不支持任何加密。Zip4j支持AES和标准zipencryption@SrikanthLingala您是否添加过此功能?如果是这样的话,介意举个例子吗?这是一个很好的答案,提供了一个完全可用的例子。值得将其添加到zip4j的示例中。@srikanthredtylingala如何在现已发布的版本2中轻松实现这一点?还是一样的程序吗?嗨,S