Java文件加密实战指南:从基础到进阶
引言
数据安全是软件开发中的重中之重,文件加密是保护敏感信息的有效手段。Java提供了强大的加密API,支持多种对称和非对称加密算法。本文将聚焦于对称加密算法在文件加密中的应用,并给出完整的代码实现。
加密算法选择
推荐使用AES(高级加密标准),它比DES更安全,且速度较快。对于文件加密,通常采用AES/CBC/PKCS5Padding模式。
核心步骤
- 生成密钥或通过口令派生密钥(使用PBKDF2)。
- 初始化Cipher对象,设置为加密/解密模式。
- 读写文件时,使用CipherInputStream或CipherOutputStream进行流式处理。
- 注意处理初始化向量(IV)的存储与传递。
代码示例
import javax.crypto.*;
import javax.crypto.spec.*;
import java.io.*;
import java.security.*;
public class FileEncryptor {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
public static void encryptFile(String key, File inputFile, File outputFile) throws Exception {
SecretKeySpec secretKey = getKeySpec(key);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] iv = cipher.getIV();
try (FileOutputStream fos = new FileOutputStream(outputFile);
CipherOutputStream cos = new CipherOutputStream(fos, cipher);
FileInputStream fis = new FileInputStream(inputFile)) {
fos.write(iv); // 将IV写入输出文件头部
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
cos.write(buffer, 0, bytesRead);
}
}
}
public static void decryptFile(String key, File inputFile, File outputFile) throws Exception {
SecretKeySpec secretKey = getKeySpec(key);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
try (FileInputStream fis = new FileInputStream(inputFile)) {
byte[] iv = new byte[16];
fis.read(iv); // 读取IV
cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
try (FileOutputStream fos = new FileOutputStream(outputFile);
CipherInputStream cis = new CipherInputStream(fis, cipher)) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = cis.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
}
}
}
private static SecretKeySpec getKeySpec(String key) throws Exception {
byte[] keyBytes = key.getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-256");
keyBytes = sha.digest(keyBytes);
return new SecretKeySpec(keyBytes, ALGORITHM);
}
}注意事项
- 密钥管理:不要硬编码密钥,建议从配置文件或密钥管理系统获取。
- IV的随机性:每次加密都应生成新的随机IV,并将其与密文一起存储。
- 性能优化:使用缓冲流和适当大小的缓冲区。
- 异常处理:确保在catch块中处理异常,避免泄露敏感信息。
总结
Java文件加密并不复杂,但需要注意细节。通过以上示例,你可以快速实现文件加密功能。记住,加密只是安全的一环,还需要配合完善的密钥管理、访问控制等措施。