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

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

相关推荐
uzong5 分钟前
深入浅出:画好技术图
后端·架构
IT_陈寒14 分钟前
Java性能优化:从这8个关键指标开始,让你的应用提速50%
前端·人工智能·后端
程序员清风14 分钟前
快手一面:为什么要求用Static来修饰ThreadLocal变量?
java·后端·面试
chen_ever25 分钟前
golang之go modules
开发语言·后端·golang
Victor35628 分钟前
Redis(54)Redis的LRU算法是什么?
后端
程序员爱钓鱼29 分钟前
Go语言实战案例 — 工具开发篇:编写高可用日志收集脚本
后端·mongodb·go
绝无仅有30 分钟前
HTTP面试之实战经验与总结
后端·面试·github
绝无仅有31 分钟前
职场面试redis经历之与一位资深技术面试官的技术问答与总结
后端·面试·github
摸鱼的春哥32 分钟前
前端程序员最讨厌的10件事
前端·javascript·后端
Victor35633 分钟前
Redis(55)Redis的内存淘汰策略有哪些?
后端