MySQL 脱敏函数使用详解:保护数据隐私的关键手段
全文目录:
- 前言
- 前言
- 为什么需要数据脱敏?
- MySQL 中常用的脱敏方法
- 1. 字符串类型数据的脱敏
- 案例:脱敏姓名
- 案例:脱敏邮箱
- 2. 数字类型数据的脱敏
- 案例:脱敏手机号
- 案例:脱敏身份证号
- 3. 自定义脱敏函数
- 自定义姓名脱敏函数
- 自定义身份证号脱敏函数
- 拓展应用:基于业务场景的脱敏
- 1. 动态脱敏策略
- 案例:根据角色进行脱敏
- 2. 脱敏与日志审计
- 3. 测试环境中的脱敏处理
- 总结
- 文末
前言
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
在现代数据管理中,数据安全和隐私保护已成为企业和开发者必须重视的核心问题。为了避免敏感数据的泄露,数据脱敏(Data Masking)作为一种常见的数据安全技术,通过对敏感数据进行部分隐藏或模糊处理,确保其在测试、开发和非生产环境中的安全性。
MySQL 作为最流行的关系型数据库之一,虽然没有内置专门的数据脱敏函数,但我们可以通过 SQL 函数和表达式来实现有效的数据脱敏。本文将详细讲解如何在 MySQL 中使用函数实现数据脱敏,并结合实际案例,展示如何灵活使用这些技术手段保护敏感信息。
为什么需要数据脱敏?
在日常业务中,特别是涉及个人隐私、财务、医疗等敏感信息的数据表,数据泄露的风险可能会带来无法估量的损失。开发、测试和分析数据时,通常不需要暴露完整的用户信息,而只需保留部分信息进行逻辑验证。此时,数据脱敏就显得尤为重要。
数据脱敏的主要目标包括:
- 保护隐私:隐藏或模糊化敏感信息,如姓名、身份证号、手机号、银行卡号等。
- 遵守法规:如 GDPR(通用数据保护条例)等法规对个人数据的使用有严格的要求。
- 数据安全:防止未经授权的用户查看敏感数据,减少数据泄露的可能性。
MySQL 中常用的脱敏方法
尽管 MySQL 没有直接提供脱敏函数,但可以通过一些内置函数和表达式来实现数据脱敏。常用的函数包括 SUBSTRING()
、REPEAT()
、CONCAT()
和 LPAD()
等。这些函数可以帮助我们部分隐藏敏感数据或将其替换为固定字符,从而达到脱敏效果。
1. 字符串类型数据的脱敏
对于涉及姓名、邮箱、地址等字符串类型的数据,常用的脱敏方式是将一部分字符隐藏,保留部分用于识别。
案例:脱敏姓名
假设我们有一个包含用户姓名的表 users
,结构如下:
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50),email VARCHAR(100)
);
我们想要实现将姓名的第二个字以 *
代替:
SELECTid,CONCAT(LEFT(name, 1), REPEAT('*', CHAR_LENGTH(name) - 1)) AS masked_name
FROM users;
解释:
LEFT(name, 1)
:取用户姓名的第一个字符。REPEAT('*', CHAR_LENGTH(name) - 1)
:将剩余的字符用*
替代。
案例:脱敏邮箱
对于邮箱地址,我们可以部分隐藏用户名,只展示前两位字符和域名部分:
SELECTid,CONCAT(LEFT(email, 2), REPEAT('*', LOCATE('@', email) - 3), SUBSTRING(email, LOCATE('@', email))) AS masked_email
FROM users;
解释:
LEFT(email, 2)
:获取邮箱前两位字符。REPEAT('*', LOCATE('@', email) - 3)
:根据@
符号的位置,将中间的字符替换为*
。SUBSTRING(email, LOCATE('@', email))
:保留@
及其后面的域名部分。
2. 数字类型数据的脱敏
对于手机号、身份证号、银行卡号等数字类型数据,可以通过隐藏中间部分数字进行脱敏。
案例:脱敏手机号
假设我们有一个包含用户手机号的表 contacts
,结构如下:
CREATE TABLE contacts (id INT AUTO_INCREMENT PRIMARY KEY,phone VARCHAR(15)
);
我们可以将手机号的中间四位用 *
替代,只显示前 3 位和最后 4 位:
SELECTid,CONCAT(LEFT(phone, 3), REPEAT('*', 4), RIGHT(phone, 4)) AS masked_phone
FROM contacts;
解释:
LEFT(phone, 3)
:获取手机号的前三位。REPEAT('*', 4)
:将中间四位替换为*
。RIGHT(phone, 4)
:保留手机号的后四位。
案例:脱敏身份证号
类似的,脱敏身份证号时我们可以将中间 8 位数字替换为 *
,只保留前 6 位和后 4 位:
SELECTid,CONCAT(LEFT(id_card, 6), REPEAT('*', 8), RIGHT(id_card, 4)) AS masked_id_card
FROM users;
3. 自定义脱敏函数
MySQL 允许我们创建存储函数,可以根据实际需求自定义脱敏逻辑。这在处理复杂数据脱敏场景时非常有用。
自定义姓名脱敏函数
我们可以创建一个存储函数,用于处理姓名脱敏:
DELIMITER //CREATE FUNCTION mask_name(input_name VARCHAR(50))
RETURNS VARCHAR(50)
BEGINRETURN CONCAT(LEFT(input_name, 1), REPEAT('*', CHAR_LENGTH(input_name) - 1));
END //DELIMITER ;
使用该函数时,我们只需简单调用它:
SELECT id, mask_name(name) AS masked_name FROM users;
自定义身份证号脱敏函数
为了复用身份证号的脱敏逻辑,也可以创建如下存储函数:
DELIMITER //CREATE FUNCTION mask_id_card(input_id_card VARCHAR(18))
RETURNS VARCHAR(18)
BEGINRETURN CONCAT(LEFT(input_id_card, 6), REPEAT('*', 8), RIGHT(input_id_card, 4));
END //DELIMITER ;
使用该函数脱敏身份证号:
SELECT id, mask_id_card(id_card) AS masked_id_card FROM users;
通过存储函数的方式,我们可以将常用的脱敏逻辑封装起来,简化日常开发和数据脱敏操作。
拓展应用:基于业务场景的脱敏
不同业务场景下,数据脱敏的需求和策略可能有所不同。我们可以根据实际业务需求对脱敏规则进行灵活调整,以确保既能满足数据安全的要求,又能兼顾数据可读性和业务需求。
1. 动态脱敏策略
在某些场景下,不同用户角色对数据的访问权限不同。比如管理员可以查看完整信息,而普通用户只能看到脱敏后的数据。此时我们可以通过动态脱敏策略,根据用户角色动态调整脱敏级别。
案例:根据角色进行脱敏
假设我们有一个包含用户角色的表 users
,角色可以是 admin
或 user
。我们希望根据角色不同来展示不同级别的脱敏信息:
SELECTid,IF(role = 'admin', name, CONCAT(LEFT(name, 1), REPEAT('*', CHAR_LENGTH(name) - 1))) AS display_name,IF(role = 'admin', email, CONCAT(LEFT(email, 2), REPEAT('*', LOCATE('@', email) - 3), SUBSTRING(email, LOCATE('@', email)))) AS display_email
FROM users;
通过 IF
函数,我们可以根据用户的角色动态决定是否进行脱敏。
2. 脱敏与日志审计
在生产环境中,敏感数据的处理不仅限于查询,还涉及到日志记录和审计。为了确保数据安全,我们可以在记录日志时对敏感信息进行脱敏,从而避免日志泄露用户隐私。
-- 在记录日志时使用脱敏数据
INSERT INTO log_table (user_id, action, masked_email)
SELECT id, 'query', CONCAT(LEFT(email, 2), REPEAT('*', LOCATE('@', email) - 3), SUBSTRING(email, LOCATE('@', email)))
FROM users
WHERE id = 123;
这种方式确保日志记录中没有暴露用户的敏感信息。
3. 测试环境中的脱敏处理
在开发和测试环境中,往往需要使用生产数据进行测试。然而,直接使用生产环境中的敏感数据存在较大的数据泄露风险。因此,数据脱敏技术在测试环境中尤为重要。
可以通过批量更新数据的方式,对敏感数据进行脱敏处理:
UPDATE users
SET email = CONCAT(LEFT(email, 2), REPEAT('*', LOCATE('@', email) - 3), SUBSTRING(email, LOCATE('@', email)));
这种处理方式确保了在测试和开发过程中,数据脱敏后的信息不会泄露给无关人员。
总结
MySQL 虽然没有内置的专用脱敏函数,但通过组合 SQL 函数和表达式,我们可以轻松实现数据脱敏。对于常见的字符串和数字类型数据,如姓名、邮箱、手机号、
身份证号等,本文展示了几种常用的脱敏方法,并提供了自定义存储函数来简化操作。此外,我们还探讨了如何基于业务场景灵活应用脱敏技术,确保数据安全和业务需求的平衡。
在实际项目中,数据安全至关重要。通过有效地管理和应用脱敏策略,开发者不仅可以保护敏感信息的安全,还能够确保应用程序在开发、测试和生产中的稳定运行。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
相关文章:
MySQL 脱敏函数使用详解:保护数据隐私的关键手段
全文目录: 前言前言为什么需要数据脱敏?MySQL 中常用的脱敏方法1. 字符串类型数据的脱敏案例:脱敏姓名案例:脱敏邮箱 2. 数字类型数据的脱敏案例:脱敏手机号案例:脱敏身份证号 3. 自定义脱敏函数自定义姓名…...
nginx之virtual host
vhost 是“virtual host”的缩写,中文译为“虚拟主机”。在Web服务器(如Nginx、Apache等)中,虚拟主机是指在同一台物理服务器上运行多个独立的网站或应用程序的技术。每个虚拟主机都有自己的域名、文档根目录、配置文件等…...

Windows 下纯手工打造 QT 开发环境
用过 QtCreator 和 VS QT 插件,都觉得不是很理想。所以有了这个想法。 手工打造的 QT 的开发环境,是不需要安装上面两个程序的。 1、下载 vcpkg,编译 QT6 下载地址:https://github.com/microsoft/vcpkg.git 进入到 …...

k8s的安装和部署
配置三台主机,分别禁用各个主机上的swap,并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…...

第十八篇:一文说清楚ICMP的底层原理
作为程序员或者网络工程师,有时候无法访问对方主机;导致这个现象的有很多原因,那要排查具体的网络原因,可能会用到ping的指令。而ping的底层实现是互联⽹控制报⽂协议(ICMP)。 ICMP 全称是 Internet Contr…...

【优选算法】(第三十二篇)
目录 ⼆进制求和(easy) 题目解析 讲解算法原理 编写代码 字符串相乘(medium) 题目解析 讲解算法原理 编写代码 ⼆进制求和(easy) 题目解析 1.题目链接:. - 力扣(LeetCode&a…...

线程(四)线程的同步——条件变量
文章目录 线程线程的同步和互斥线程同步--条件变量什么是线程同步示例--条件变量的使用示例--使用两个线程对同一个文件进行读写示例--一个读者一个写者使用条件变量来实现同步 线程 线程的同步和互斥 线程同步–条件变量 是一个宏观概念,在微观上包含线程的相互…...
二维数组的旋转与翻转(C++)(上(这只是简单讲解))
二维数组的旋转与翻转(C) 引言 在计算机科学中,二维数组是一种常见的数据结构,广泛应用于图像处理、数据挖掘、机器学习等多个领域。二维数组的旋转与翻转是处理二维数据时经常需要用到的操作。本文将详细介绍二维数组的旋转与翻…...

【在Linux世界中追寻伟大的One Piece】System V共享内存
目录 1 -> System V共享内存 1.1 -> 共享内存数据结构 1.2 -> 共享内存函数 1.2.1 -> shmget函数 1.2.2 -> shmot函数 1.2.3 -> shmdt函数 1.2.4 -> shmctl函数 1.3 -> 实例代码 2 -> System V消息队列 3 -> System V信号量 1 -> Sy…...

【大数据】Spark弹性分布式数据集RDD详细说明
文章目录 整体介绍一、定义与特性二、操作与转换三、存储级别与持久化四、依赖关系与容错机制五、优化与性能调优 常见操作支持的数据格式1.文本文件 (Text Files)2. CSV 文件3. JSON 文件4. Parquet 文件5. Sequence Files6.Hadoop文件读取A. 读取HDFS上的文本文件B. 使用Hado…...

人参玉桂膏简介
一、产品基本信息 产品名称:人参玉桂膏 产品类别:植物饮料(专为特定体质设计) 配料:精选薏苡仁、荷叶、玉米须、赤小豆等纯然植物成分,辅以麦芽糖醇液、低聚果糖调节口感,陈皮、肉桂、人参&…...

消费者Rebalance机制
优质博文:IT-BLOG-CN 一、消费者Rebalance机制 在Apache Kafka中,消费者组 Consumer Group会在以下几种情况下发生重新平衡Rebalance: 【1】消费者加入或离开消费者组: 当一个新的消费者加入消费者组或一个现有的消费者离开消费…...
消息队列介绍
一、ActiveMQ 优点:性能单台(6000)成熟,已经在很多公司得到应用。各种协议支持好,有多个语言的成熟客户端 缺点:性能较弱,缺乏大规模吞吐的场景的应用,有江河日下之感 二、RabbitMQ…...
告别@Value,Spring Boot 3.3更优雅的配置注入方案
在Spring Boot的早期版本中,我们常使用Value注解来注入配置文件中的属性值。然而,这种方式虽然简单直接,却存在一些局限,比如它只能注入基本类型的值,并且需要显式地在每个需要注入的字段上使用注解。随着Spring Boot的…...

甲虫身体图像分割系统源码&数据集分享
甲虫身体图像分割系统源码&数据集分享 [yolov8-seg-EfficientRepBiPAN&yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…...

Qt - QMenu
QMenu 1、menu转string输出 //GlobalEnum.h #include <QObject> #include <QMetaEnum> class GlobalEnum : public QObject {Q_OBJECT public:EnumTest();enum Enum_Test{ZhangSan 0,WangWu,};Q_ENUM(Enum_Test) };#define EnumToString(e) \ QMetaEnum::fromTy…...

舵机驱动详解(模拟/数字 STM32)
目录 一、介绍 二、模块原理 1.舵机驱动原理 2.引脚描述 三、程序设计 main.c文件 servo.h文件 servo.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 舵机(Servo)是在程序的控制下,在一定范围内连续改变输出轴角度并保持的电机系统。即舵机只支持…...

dvwa:文件包含、文件上传
文件包含 本地文件包含(敏感信息泄露)和远程文件包含(命令执行) 本地文件包含一般包含一些本地的敏感文件,如:/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行,如包含黑客vps的…...
基于 C# .NET Framework 4.0 开发实现 WCF 服务实例详解(二)——实现Windows服务内嵌WCF服务
目录 引言 1. 创建一个新的Windows服务项目 2. 添加WCF服务 2.1 添加服务接口和实现 2.2 添加服务配置 3. 实现Windows服务 3.1 修改Service1类 3.2 在项目中添加ServiceInstaller 4. 安装和运行Windows服务 4.1 编译项目 4.2 使用InstallUtil.exe安装服务 …...
【ArcGIS/C#】调用控制台处理代码
代码示例 private static string[] run_conda_process(string command, Action<string> on_msg, CancellationTokenSource cancel){if (string.IsNullOrEmpty(command)){return new string[]{null,ArcGIS.Desktop.Internal.Core.Conda.Resources.Error_Unexpected + &qu…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...