加密存储敏感数据是保护数据免受未授权访问的关键步骤。以下是如何在Java应用程序中使用AES(Advanced Encryption Standard)算法进行数据加密和解密,并将加密后的数据存储到数据库中的详细过程。
一. 环境准备
确保你有一个Java开发环境(如JDK和Maven)以及一个数据库环境(如MySQL)。
二. 使用Java进行数据加密和解密
我们将使用Java的javax.crypto
包来实现AES加密和解密。
1. 创建加密和解密类
首先,我们创建一个名为DataEncryption
的类,用于处理AES加密和解密操作。
java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class DataEncryption {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES";
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
keyGenerator.init(256); // AES 256 bits key
return keyGenerator.generateKey();
}
public static String encrypt(String data, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] encryptedBytes = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String encryptedData, SecretKey key) throws Exception {
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));
return new String(decryptedBytes);
}
}
2. 测试加密和解密
我们可以创建一个简单的测试类来验证加密和解密功能。
java
public class TestEncryption {
public static void main(String[] args) throws Exception {
String originalData = "Sensitive Data";
SecretKey secretKey = DataEncryption.generateKey();
String encryptedData = DataEncryption.encrypt(originalData, secretKey);
System.out.println("Encrypted Data: " + encryptedData);
String decryptedData = DataEncryption.decrypt(encryptedData, secretKey);
System.out.println("Decrypted Data: " + decryptedData);
}
}
三. 整合加密功能到数据库操作
接下来,我们将加密后的数据存储到数据库中,并在读取数据时进行解密。
1. 添加MySQL依赖
在pom.xml
文件中添加MySQL JDBC驱动依赖。
xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
2. 创建数据库和表
创建一个数据库和表,用于存储加密的数据。
sql
CREATE DATABASE sensitive_data_db;
USE sensitive_data_db;
CREATE TABLE encrypted_data (
id INT AUTO_INCREMENT PRIMARY KEY,
data VARCHAR(255) NOT NULL
);
3. 创建服务类进行数据库操作
我们创建一个服务类EncryptionService
,用于加密数据并将其存储到数据库中,以及从数据库中读取数据并进行解密。
java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class EncryptionService {
private static final String URL = "jdbc:mysql://localhost:3306/sensitive_data_db";
private static final String USER = "root";
private static final String PASSWORD = "password";
private SecretKey secretKey;
public EncryptionService(SecretKey secretKey) {
this.secretKey = secretKey;
}
public void storeEncryptedData(String data) throws Exception {
String encryptedData = DataEncryption.encrypt(data, secretKey);
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {
String sql = "INSERT INTO encrypted_data (data) VALUES (?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, encryptedData);
pstmt.executeUpdate();
}
}
}
public String retrieveDecryptedData(int id) throws Exception {
String encryptedData = null;
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {
String sql = "SELECT data FROM encrypted_data WHERE id = ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
encryptedData = rs.getString("data");
}
}
}
if (encryptedData != null) {
return DataEncryption.decrypt(encryptedData, secretKey);
} else {
throw new Exception("Data not found for ID: " + id);
}
}
}
4. 测试存储和读取加密数据
创建一个测试类来验证数据存储和读取的加密和解密功能。
java
public class TestDatabaseEncryption {
public static void main(String[] args) throws Exception {
SecretKey secretKey = DataEncryption.generateKey();
EncryptionService encryptionService = new EncryptionService(secretKey);
// 加密并存储数据
String sensitiveData = "Sensitive Data";
encryptionService.storeEncryptedData(sensitiveData);
System.out.println("Data stored successfully!");
// 从数据库中读取并解密数据
String decryptedData = encryptionService.retrieveDecryptedData(1);
System.out.println("Decrypted Data: " + decryptedData);
}
}
总结
通过以上步骤,我们详细介绍了如何在Java应用中使用AES算法对敏感数据进行加密和解密,并将加密后的数据存储到数据库中。这个过程包括:
- 使用Java实现AES加密和解密。
- 生成和管理加密密钥。
- 将加密数据存储到数据库中,并在读取时进行解密。
通过这种方式,可以有效保护数据库中的敏感数据,防止数据泄露和未授权访问。