In this post, I am going to explain how
to create password-protected file in Java. I am going to use Zip4j, a java
open-source library to handle Zip files.
Following
are the Key features of Zip4j
a. Create, Add, Extract, Update, Remove
files from a Zip file
b. Read/Write password protected Zip files
c. Supports AES 128/256 Encryption
d. Supports Standard Zip Encryption
e. Supports Zip64 format
f. Supports Store (No Compression) and
Deflate compression method
g. Create or extract files from Split Zip
files (Ex: z01, z02,...zip)
h. Supports Unicode file names
i. Progress Monitor
Following step-by-step procedure
explains how to create a password protected zip file using Zip4j library.
Step
1: Instantiate ZipFile
instance.
ZipFile zipFile = new
ZipFile(zipFileName);
Step
2: Define list of files
to zip.
List<String> filesToZip = new
ArrayList<String> ();
Step
3: Instantiate
ZipParameters. Following are some of the properties associated with
ZipParameters used while zipping files.
1. Compression method
2. Compression level
3. Whether to encrypt files or not
4. Encryption method
5. Whether to read hidden files or not
6. Secret key length etc.,
ZipParameters zipParameters = new
ZipParameters();
Step
4: Set Compression
type.
zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
Step
5: Set Compression
level. Following constants represent the compression levels supported by Zip4j.
static final int DEFLATE_LEVEL_FASTEST =
1;
static final int DEFLATE_LEVEL_FAST = 3;
static final int DEFLATE_LEVEL_NORMAL =
5;
static final int DEFLATE_LEVEL_MAXIMUM =
7;
static final int DEFLATE_LEVEL_ULTRA =
9;
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
Step
6: Set encryptFiles to
true.
zipParameters.setEncryptFiles(true);
Step
7: Select the
Encryption method to encrypt files.
Following constants represent the
encryption method.
static final int ENC_NO_ENCRYPTION = -1;
static final int ENC_METHOD_STANDARD =
0;
static final int ENC_METHOD_AES = 99;
zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES);
Step
8: Since I am going to
use AES algorithm to encrypt files, I need to set the key length for it.
Following constants specifies the AES key length.
static final int AES_STRENGTH_128 =
0x01;
static final int AES_STRENGTH_192 =
0x02;
static final int AES_STRENGTH_256 =
0x03;
zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256);
Step
9: Set the password for
the zip file. Always use password as character array. Following link explains,
why to use password as character array than string.
zipParameters.setPassword(password);
Following is the complete working
application.
import java.io.File; import java.util.ArrayList; import java.util.List; import net.lingala.zip4j.core.ZipFile; import net.lingala.zip4j.exception.ZipException; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.util.Zip4jConstants; public class FileUtils { /** * * @param zipFileName * @param filesToZip * @param password * Password for zip file * @return true if files are zipped successfully, else false. */ public static boolean zipFiles(String zipFileName, List<File> filesToZip, char[] password) { try { /* Instantiate ZipFile */ ZipFile zipFile = new ZipFile(zipFileName); /* Instantiate ZipParameters */ ZipParameters zipParameters = new ZipParameters(); /* Set compression type */ zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE); /* Set Compression level */ zipParameters .setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL); /* Set encryptFiles to true */ zipParameters.setEncryptFiles(true); /* Select the Encryption method to encrypt fies */ zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_AES); /* Set AES key length */ zipParameters.setAesKeyStrength(Zip4jConstants.AES_STRENGTH_256); /* Set the password for zip file */ zipParameters.setPassword(password); zipFile.addFiles(new ArrayList<>(filesToZip), zipParameters); } catch (ZipException e) { e.printStackTrace(); return false; } return true; } }
import java.io.File; import java.util.ArrayList; import java.util.List; public class FileUtilsTest { public static void main(String ptr[]) { String zipFileName = "/Users/harikrishna_gurram/ptr.zip"; List<File> filesToZip = new ArrayList<>(); char[] password = { 'p', 'T', 'r', '5', '1', '4' }; filesToZip.add(new File("/Users/harikrishna_gurram/data.txt")); filesToZip.add(new File("/Users/harikrishna_gurram/doc_template.txt")); filesToZip.add(new File("/Users/harikrishna_gurram/hadoop_commands.txt")); boolean isFilesZipped = FileUtils.zipFiles(zipFileName, filesToZip, password); if(isFilesZipped){ System.out.println("Files are zipped successfully"); }else{ System.out.println("Files zipping failed"); } } }
Output
Files are
zipped successfully
Try to open
the zip file, it prompts you for the password.
References
You may like
i tried to execute this but while opening the zip file using winRAR it is not prmpting for password
ReplyDelete