Java压缩文件并加密:实现安全高效的数据打包
Java压缩文件并加密:实现安全高效的数据打包
一、为什么需要压缩并加密?
在数据传输和存储过程中,压缩可以减少占用空间和传输时间,而加密能保护数据不被未授权访问。Java提供了强大的IO流和加密API,可以方便地将两者结合。
二、核心思路
使用ZipOutputStream进行压缩,同时通过CipherOutputStream对输出流进行AES加密。解压时则反向操作:先解密,再解压。
三、代码实现
1. 压缩并加密
import javax.crypto.Cipher;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipEncrypt {
public static void compressAndEncrypt(String srcDir, String zipFile, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
try (FileOutputStream fos = new FileOutputStream(zipFile);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
ZipOutputStream zos = new ZipOutputStream(cos)) {
File dir = new File(srcDir);
for (File file : dir.listFiles()) {
zos.putNextEntry(new ZipEntry(file.getName()));
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) > 0) {
zos.write(buffer, 0, len);
}
}
zos.closeEntry();
}
}
}
}2. 解密并解压
public static void decryptAndExtract(String zipFile, String destDir, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
try (FileInputStream fis = new FileInputStream(zipFile);
CipherInputStream cis = new CipherInputStream(fis, cipher);
ZipInputStream zis = new ZipInputStream(cis)) {
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
File destFile = new File(destDir, entry.getName());
try (FileOutputStream fos = new FileOutputStream(destFile)) {
byte[] buffer = new byte[1024];
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
}
zis.closeEntry();
}
}
}四、密钥管理
密钥需安全存储,例如使用KeyStore或环境变量。实际生产环境建议使用密钥管理服务(KMS)或密钥派生函数(如PBKDF2)从密码生成密钥。
五、注意事项
- AES/CBC/PKCS5Padding需要初始化向量(IV),示例中使用了默认全零IV,生产环境应随机生成并存储。
- 压缩流和加密流的嵌套顺序不可颠倒:先加密后压缩,则加密的是原始数据;先压缩后加密,则加密的是压缩流。两种方式均可,但解压顺序需对应。
- 大文件处理时需考虑内存和性能,可使用缓冲流。
六、总结
通过Java的IO流组合,可以轻松实现压缩与加密的功能。本文提供的方法既可保证数据紧凑传输,又能确保机密性。开发者可根据实际需求调整算法和参数。