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. 将加密数据存储到数据库中,并在读取时进行解密。

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

相关推荐
rzl025 分钟前
SpringBoot总结
spring boot·后端·firefox
小鱼人爱编程1 小时前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
hqxstudying1 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_8281 小时前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
程序员爱钓鱼1 小时前
Go语言实战案例-滑动窗口最大值
后端·google·go
Victor3562 小时前
MySQL(163) 如何理解MySQL的隔离级别?
后端
Victor3562 小时前
MySQL(164)如何设置MySQL的隔离级别?
后端
代码老y3 小时前
ASP.NET Core 高并发万字攻防战:架构设计、性能优化与生产实践
后端·性能优化·asp.net
武子康8 小时前
Java-80 深入浅出 RPC Dubbo 动态服务降级:从雪崩防护到配置中心秒级生效
java·分布式·后端·spring·微服务·rpc·dubbo
舒一笑9 小时前
我的开源项目-PandaCoder迎来史诗级大更新啦
后端·程序员·intellij idea