MySQL(119)如何加密存储敏感数据?

加密存储敏感数据是保护数据免受未授权访问的关键步骤。以下是如何在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算法对敏感数据进行加密和解密,并将加密后的数据存储到数据库中。这个过程包括:

  1. 使用Java实现AES加密和解密。
  2. 生成和管理加密密钥。
  3. 将加密数据存储到数据库中,并在读取时进行解密。

通过这种方式,可以有效保护数据库中的敏感数据,防止数据泄露和未授权访问。

相关推荐
大鸡腿同学38 分钟前
身弱武修法:玄之又玄,奇妙之门
后端
轻语呢喃2 小时前
JavaScript :字符串模板——优雅编程的基石
前端·javascript·后端
MikeWe3 小时前
Paddle张量操作全解析:从基础创建到高级应用
后端
岫珩3 小时前
Ubuntu系统关闭防火墙的正确方式
后端
心之语歌3 小时前
Java高效压缩技巧:ZipOutputStream详解
java·后端
不死的精灵4 小时前
【Java21】在spring boot中使用ScopedValue
java·spring boot·后端
M1A14 小时前
TCP/IP协议精解:IP协议——互联网世界的邮政编码系统
后端·网络协议·tcp/ip
逸风尊者4 小时前
开发易掌握的知识:GeoHash查找附近空闲车辆
java·后端
程序猿阿越5 小时前
Kafka源码(一)Controller选举与创建Topic
java·后端·源码
程序员爱钓鱼5 小时前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin