MySQL数据脱敏的实现方法

 更新时间:2025年08月10日 11:06:44   作者:Victor356  
本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下

数据脱敏(Data Masking)是指通过某种方式对敏感数据进行变形,使其在使用过程中无法识别原始数据,从而保护数据隐私。数据脱敏通常应用在开发、测试和数据分析等场景中。下面我们详细介绍如何在Java应用程序中进行数据脱敏,并结合代码示例进行说明。

一. 数据脱敏的方法

常见的数据脱敏方法有:

  1. 字符替换:用特定字符替换部分敏感数据,例如将身份证号的中间部分用“*”替换。
  2. 加密:对数据进行加密,使其难以识别。
  3. 数据混淆:通过改变数据的原始结构,使其不可识别。
  4. 数据截断:只显示部分数据,隐藏其余部分。

二. 字符替换脱敏

以下示例展示了如何使用字符替换的方法进行数据脱敏。我们将实现一个简单的工具类,用于对不同类型的敏感数据进行脱敏处理。

1. 创建数据脱敏工具类

我们创建一个名为DataMaskingUtil的工具类,提供各种常见的脱敏方法。

public class DataMaskingUtil {

    /**
     * 脱敏处理:将字符串的中间部分用指定字符替换。
     *
     * @param str         待脱敏的字符串
     * @param start       开始保留多少位
     * @param end         末尾保留多少位
     * @param maskChar    替换的字符
     * @return            脱敏处理后的字符串
     */
    public static String mask(String str, int start, int end, char maskChar) {
        if (str == null || str.length() <= start + end) {
            return str;
        }

        StringBuilder maskedString = new StringBuilder();
        for (int i = 0; i < str.length(); i++) {
            if (i < start || i >= str.length() - end) {
                maskedString.append(str.charAt(i));
            } else {
                maskedString.append(maskChar);
            }
        }
        return maskedString.toString();
    }

    /**
     * 对手机号进行脱敏处理
     *
     * @param phoneNumber 原始手机号
     * @return            脱敏后的手机号
     */
    public static String maskPhoneNumber(String phoneNumber) {
        return mask(phoneNumber, 3, 4, '*');
    }

    /**
     * 对身份证号进行脱敏处理
     *
     * @param idNumber 原始身份证号
     * @return         脱敏后的身份证号
     */
    public static String maskIDNumber(String idNumber) {
        return mask(idNumber, 3, 4, '*');
    }

    /**
     * 对电子邮箱进行脱敏处理
     *
     * @param email 原始电子邮箱
     * @return      脱敏后的电子邮箱
     */
    public static String maskEmail(String email) {
        if (email == null || !email.contains("@")) {
            return email;
        }

        String[] parts = email.split("@");
        String localPart = parts[0];
        String domainPart = parts[1];

        String maskedLocalPart = localPart.length() <= 2 ? localPart : mask(localPart, 1, 1, '*');
        return maskedLocalPart + "@" + domainPart;
    }

    /**
     * 对信用卡号进行脱敏处理
     *
     * @param creditCardNumber 原始信用卡号
     * @return                 脱敏后的信用卡号
     */
    public static String maskCreditCardNumber(String creditCardNumber) {
        return mask(creditCardNumber, 4, 4, '*');
    }

    public static void main(String[] args) {
        // 测试脱敏处理
        System.out.println("Phone Number: " + maskPhoneNumber("13812345678"));
        System.out.println("ID Number: " + maskIDNumber("123456789012345678"));
        System.out.println("Email: " + maskEmail("example@example.com"));
        System.out.println("Credit Card Number: " + maskCreditCardNumber("1234123412341234"));
    }
}

三. 整合到数据库操作

我们可以将数据脱敏功能集成到数据库操作中,以确保在查询结果中对敏感数据进行脱敏处理。

1. 创建服务类进行数据库操作

假设我们有一个名为User的实体类,其中包含敏感信息,如手机号、身份证号等。

public class User {
    private int id;
    private String name;
    private String phoneNumber;
    private String idNumber;
    private String email;
    private String creditCardNumber;

    // Getters and setters
    // ...
}

2. 创建数据库操作服务类

我们创建一个服务类UserService,用于从数据库中查询用户信息并进行脱敏处理。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class UserService {
    private static final String URL = "jdbc:mysql://localhost:3306/sensitive_data_db";
    private static final String USER = "root";
    private static final String PASSWORD = "password";

    public User getUserById(int userId) throws Exception {
        User user = null;
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {
            String sql = "SELECT * FROM users WHERE id = ?";
            try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
                pstmt.setInt(1, userId);
                ResultSet rs = pstmt.executeQuery();
                if (rs.next()) {
                    user = new User();
                    user.setId(rs.getInt("id"));
                    user.setName(rs.getString("name"));
                    user.setPhoneNumber(DataMaskingUtil.maskPhoneNumber(rs.getString("phone_number")));
                    user.setIdNumber(DataMaskingUtil.maskIDNumber(rs.getString("id_number")));
                    user.setEmail(DataMaskingUtil.maskEmail(rs.getString("email")));
                    user.setCreditCardNumber(DataMaskingUtil.maskCreditCardNumber(rs.getString("credit_card_number")));
                }
            }
        }
        return user;
    }

    public static void main(String[] args) throws Exception {
        UserService userService = new UserService();
        User user = userService.getUserById(1);
        if (user != null) {
            System.out.println("User ID: " + user.getId());
            System.out.println("Name: " + user.getName());
            System.out.println("Phone Number: " + user.getPhoneNumber());
            System.out.println("ID Number: " + user.getIdNumber());
            System.out.println("Email: " + user.getEmail());
            System.out.println("Credit Card Number: " + user.getCreditCardNumber());
        }
    }
}

四. 测试数据脱敏

运行上述代码,可以看到从数据库中查询到的用户信息已经经过了脱敏处理,敏感数据部分被替换为特定的掩码字符。

总结

通过以上步骤,我们详细介绍了如何在Java应用程序中进行数据脱敏。这个过程包括:

  1. 创建数据脱敏工具类,提供多种脱敏方法。
  2. 创建数据库操作服务类,将数据脱敏功能集成到数据库查询中。
  3. 测试数据脱敏功能,确保敏感数据在查询结果中被适当掩码。

通过这种方式,可以有效保护数据隐私,防止敏感信息泄露。

到此这篇关于MySQL数据脱敏的实现方法的文章就介绍到这了,更多相关MySQL数据脱敏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL进行表之间关联更新的实现方法

    MySQL进行表之间关联更新的实现方法

    在实际编程工作或运维实践中,对MySQL数据库表进行关联更新是一种比较常见的应用场景,针对这样的业务场景,我们来看看有什么方法可以实现关联更新,需要的朋友可以参考下
    2023-10-10
  • mysql exists与not exists实例详解

    mysql exists与not exists实例详解

    这篇文章主要介绍了mysql exists与not exists实例详解的相关资料,鉴于 not exists 的效率往往要高于 not in , 所以一般情况下会使用前者替代后者,需要的朋友可以参考下
    2017-07-07
  • Linux下将数据库从MySQL迁移到MariaDB的基础操作教程

    Linux下将数据库从MySQL迁移到MariaDB的基础操作教程

    这篇文章主要介绍了将数据库从MySQL迁移到MariaDB的基础操作教程,当然迁移之前不要忘记数据库的备份!需要的朋友可以参考下
    2015-11-11
  • Mysql开启慢SQL并分析原因

    Mysql开启慢SQL并分析原因

    今天小编就为大家分享一篇关于Mysql开启慢SQL并分析原因,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • MySQL中的binlog相关命令和恢复技巧

    MySQL中的binlog相关命令和恢复技巧

    这篇文章主要介绍了MySQL中的binlog相关命令和恢复技巧,需要的朋友可以参考下
    2014-05-05
  • mysql日期date型和int型互换的方法

    mysql日期date型和int型互换的方法

    下面小编就为大家带来一篇mysql日期date型和int型互换的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-10-10
  • 详解MySql的慢查询分析及开启慢查询日志

    详解MySql的慢查询分析及开启慢查询日志

    本篇文章主要介绍了详解MySql的慢查询分析及开启慢查询日志,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • MySQL explain根据查询计划去优化SQL语句

    MySQL explain根据查询计划去优化SQL语句

    MySQL是一种常见的关系型数据库管理系统,常被用于各种应用程序中存储数据,当涉及到大量的数据时,就需要MySQL的explain功能来帮助优化,本文将详细介绍MySQL的explain功能,感兴趣的朋友可以参考阅读
    2023-04-04
  • MySQL数据库误删回滚的解决

    MySQL数据库误删回滚的解决

    本文主要介绍了MySQL数据库误删回滚的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 阿里云云服务器mysql密码找回的方法

    阿里云云服务器mysql密码找回的方法

    这篇文章主要介绍了阿里云云服务器mysql密码找回的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07

最新评论