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)
);

我们想要实现将姓名的第二个字以 * 代替:

SELECT
    id,
    CONCAT(LEFT(name, 1), REPEAT('*', CHAR_LENGTH(name) - 1)) AS masked_name
FROM users;

解释:

  • LEFT(name, 1):取用户姓名的第一个字符。
  • REPEAT('*', CHAR_LENGTH(name) - 1):将剩余的字符用 * 替代。
案例:脱敏邮箱

对于邮箱地址,我们可以部分隐藏用户名,只展示前两位字符和域名部分:

SELECT
    id,
    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 位:

SELECT
    id,
    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 位:

SELECT
    id,
    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)
BEGIN
    RETURN 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)
BEGIN
    RETURN 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,角色可以是 adminuser。我们希望根据角色不同来展示不同级别的脱敏信息:

SELECT
    id,
    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 !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/890410.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据-158 Apache Kylin 安装配置详解 集群模式启动

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

多态常见面试问题

1、什么是多态? 多态(Polymorphism)是面向对象编程中的一个重要概念,它允许同一个接口表现出不同的行为。在C中,多态性主要通过虚函数来实现,分为编译时多态(静态多态)和运行时多态…

Qt事件——鼠标事件

通过label来显示各种事件 鼠标按下事件 //按下显示坐标 void MyLabel::mousePressEvent(QMouseEvent * ev) {int i ev->x();int j ev->y();//判断按下的鼠标键位if (ev->button() Qt::LeftButton) {qDebug() << "LeftButton";}else if (ev->bu…

HAL库常用的函数:

目录 HAL库&#xff1a; 1.GPIO常用函数&#xff1a; 1.HAL_GPIO_ReadPin( ) 2.HAL_GPIO_WritePin( ) 3.HAL_GPIO_TogglePin( ) 4.HAL_GPIO_EXTI_IRQHandler( ) 5.HAL_GPIO_EXTI_Callback( ) 2.UART常用函数&#xff1a; 1.HAL_U…

数通--3

一、动态路由 内部 路由器之间要互联互通&#xff0c;必须遵循相同的协议 企业内部用 IGP&#xff0c;企业之间用BGP RIP&#xff08;已淘汰&#xff0c;不考&#xff09; 距离就是长短&#xff0c;矢量就是方向&#xff0c;即路由的出接口 一台路由器 A 配好RIP&#xff0c;…

JavaWeb 17.过滤器

目录 一、过滤器概述 生活举例&#xff1a;公司前台&#xff0c;停车场安保系统&#xff0c;地铁检票闸机 过滤器开发中应用场景 过滤器工作位置图解 Filter接口API&#xff1a; 二、过滤器过滤过程图解 三、过滤器生命周期 四、过滤器链的使用 工作流程图解 注解方式配置过滤…

map和set(一)

首先模拟一下key形式类 使用的结构是搜索二叉树 结点中有左孩子和右孩子 还有一个存储的值 template <class K>struct BSTnode//搜索二叉树不支持修改 中序遍历是有序的{K _key;BSTnode<K>* _left;BSTnode<K>* _right;BSTnode(const K& key):_key(key…

网络资源模板--Android Studio 实现记事本App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的记事本App 二、项目测试环境 三、项目详情 首页 显示笔记列表&#xff1a;使用 ListView 显示从数据库中查询到的笔记内容。搜索功能&#xff…

web-105linux权限提升

rsync未授权本地覆盖 Rsync 是 linux 下一款数据备份工具&#xff0c;默认开启 873 端口 https://vulhub.org/#/environments/rsync/common/ 借助 Linux 默认计划任务调用/etc/cron.hourly&#xff0c;利用 rsync 连接覆盖 前提条件就是需要知道rsync的密码或者存在未授权 -提…

Java微信支付接入(6) - API V3 Native 支付通知API

官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml 通知规则&#xff1a;用户支付完成后&#xff0c;微信会把相关支付结果和用户信息发送给商户&#xff0c;商户需要接收处理该消息&#xff0c;并返回应答。对后台通知交互时&#xff0c…

如何解决 Vim 中的 “E212: Can‘t open file for writing“ 错误:从编辑到权限管理(sudo)

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

第十五届蓝桥杯C++B组省赛

文章目录 1.握手问题解题思路1&#xff08;组合数学&#xff09;解题思路2&#xff08;暴力枚举&#xff09; 2.小球反弹做题思路 3.好数算法思路&#xff08;暴力解法&#xff09;---不会超时 4.R格式算法思路 5.宝石组合算法思路---唯一分解定理 6.数字接龙算法思路----DFS 7…

TinyOS 点对基站通信

文章目录 一、前言1.1 发包的BlinkToRadio的数据包格式 二、混淆基站源码分析2.1 Makefile2.2 组件连接2.3 主逻辑代码 一、前言 1.1 发包的BlinkToRadio的数据包格式 如下&#xff0c;注意&#xff1a;AM层类型(1byte)即handlerID使可以在组件中修改的。 二、混淆基站源码…

uniapp学习(004-1 组件 Part.2生命周期)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战&#xff0c;开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第31p-第p35的内容 文章目录 组件生命周期我们主要使用的三种生命周期setup(创建组件时执行)不可以操作dom节点…

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器

使用 three.js和 shader 实现一个五星红旗 飘扬得着色器 源链接&#xff1a;https://threehub.cn/#/codeMirror?navigationThreeJS&classifyshader&idchinaFlag 国内站点预览&#xff1a;http://threehub.cn github地址: https://github.com/z2586300277/three-ce…

python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS)

python异常检测 - Stochastic Outlier Selection (SOS) 前言 随机离群选择SOS算法全称stochastic outlier selection algorithm. 该算法的作者是jeroen janssens. SOS算法是一种无监督的异常检测算法. 随机离群选择SOS算法原理 随机离群选择SOS算法的输入: 特征矩阵(featu…

【代码】集合set

哈喽大家好&#xff0c;我是学霸小羊&#xff0c;今天来讲一讲集合&#xff08;set&#xff09;。 在数学上&#xff0c;集合长这样&#xff1a; 那今天就来讲一讲编程上的集合。 集合的定义&#xff1a;把一些元素按照某些规律放在一起&#xff0c;就形成了一个集合。比如说…

stm32单片机个人学习笔记10(TIM编码器接口)

前言 本篇文章属于stm32单片机&#xff08;以下简称单片机&#xff09;的学习笔记&#xff0c;来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记&#xff0c;只能做参考&#xff0c;细节方面建议观看视频&#xff0c;肯定受益匪浅。 STM32入门教程-2023版 细…

论文笔记:Template-Based Named Entity Recognition Using BART

论文来源&#xff1a;ACL 2021 Finding 论文链接&#xff1a;https://aclanthology.org/2021.findings-acl.161.pdf 论文代码&#xff1a;GitHub - Nealcly/templateNER: Source code for template-based NER 笔记仅供参考&#xff0c;撰写不易&#xff0c;请勿恶意转载抄袭…

D35【python 接口自动化学习】- python基础之输入输出与文件操作

day35 文件合并 学习日期&#xff1a;20241012 学习目标&#xff1a;输入输出与文件操作&#xfe63;-47 如何使用python合并多个文件&#xff1f; 学习笔记&#xff1a; 合并文件需求分析 合并两个文件 代码实现 # 合并两个文件 with open(demo1.txt) as f1:file_data_1f…