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

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

相关推荐
唐叔在学习4 分钟前
文档转换神器pypandoc详解:解锁Python跨格式文档转换的终极姿势
后端·python
拂晓银砾1 小时前
数据库字段多类型Json值处理
java·后端
用户4099322502122 小时前
PostgreSQL处理SQL居然像做蛋糕?解析到执行的4步里藏着多少查询优化的小心机?
后端·ai编程·trae
代码匠心2 小时前
从零开始学Flink:数据输出的终极指南
java·大数据·后端·flink
IT_陈寒3 小时前
SpringBoot性能调优实战:5个让接口响应速度提升300%的关键配置
前端·人工智能·后端
xcLeigh3 小时前
Python操作国产金仓数据库(KingbaseES)全流程:搭建连接数据库的API接口
后端
whltaoin5 小时前
Spring Boot 常用注解分类整理(含用法示例)
java·spring boot·后端·注解·开发技巧
唐叔在学习5 小时前
【Git神技】三步搞定指定分支克隆,团队协作效率翻倍!
git·后端
咸菜一世5 小时前
Scala的while语句循环
后端
嚴寒5 小时前
Halo 博客系统部署配置
后端