Java文件加密实战指南:从基础到进阶

引言

数据安全是软件开发中的重中之重,文件加密是保护敏感信息的有效手段。Java提供了强大的加密API,支持多种对称和非对称加密算法。本文将聚焦于对称加密算法在文件加密中的应用,并给出完整的代码实现。

加密算法选择

推荐使用AES(高级加密标准),它比DES更安全,且速度较快。对于文件加密,通常采用AES/CBC/PKCS5Padding模式。

核心步骤

  1. 生成密钥或通过口令派生密钥(使用PBKDF2)。
  2. 初始化Cipher对象,设置为加密/解密模式。
  3. 读写文件时,使用CipherInputStream或CipherOutputStream进行流式处理。
  4. 注意处理初始化向量(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文件加密并不复杂,但需要注意细节。通过以上示例,你可以快速实现文件加密功能。记住,加密只是安全的一环,还需要配合完善的密钥管理、访问控制等措施。