MySQL 脱敏函数使用详解:保护数据隐私的关键手段

news2024/11/15 7:22:00

全文目录:

    • 前言
    • 前言
    • 为什么需要数据脱敏?
    • 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.coloradmin.cn/o/2211431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【最新华为OD机试E卷-支持在线评测】英文输入法(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

AD之Layout设计规则

设计规则&#xff1a; 间距 线宽 过孔 铺铜 其他 1.添加类 这里建立了PWR类&#xff0c;与电源相关的网络 2.间距规则:6mil的成本低 3.线宽规则&#xff1a;PWR的优先级排第一&#xff0c;否则不起作用 4.过孔规则&#xff1a;8mil<大小<12mil 4.铺铜规则

音视频开发:FFmpeg库的使用

文章目录 一、FFmpeg的介绍二、FFmpeg的安装三、FFmpeg的使用1.ffplay&#xff1a;播放音视频2.ffprobe&#xff1a;查看视频信息3.ffmpeg&#xff1a;处理视频(1)格式转换(2)帮助 四、参考资料 一、FFmpeg的介绍 FFmpeg 是使用广泛的多媒体框架&#xff0c;是一个强大的音视频…

LeetCode讲解篇之740. 删除并获得点数

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 首先对于这题我们如果将所有点数装入一个切片f中&#xff0c;该切片f中的i号下标表示所有点数为i的点数之和 那么这题就转换成了打家劫舍这道题&#xff0c;也就是求选择了切片中某个下标的元素后&#xff0c;该…

观察者模式和发布-订阅模式的区别

观察者模式是&#xff0c;当被观察者的数据发生变化时&#xff0c;调用被观察者的 notify 方法&#xff0c;去通知所有观察者执行 update 方法进行更新&#xff1b; 对于发布-订阅模式&#xff0c;首先发布者与订阅者互相并不知道彼此的存在&#xff0c;他们是通过事件中心来进…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

微知-Mellanox 网卡和NVIDIA Bluefield DPU如何备份firmware?

某些场合需要从网卡或者DPU上读取网卡的firmware 备份命令&#xff1a; flint -d 06:00.0 ri 1.bin实操&#xff1a; 注意&#xff1a; 有些网卡不支持到处firmware

工具软件分享:11个免费的 android数据恢复应用程序功能分析

在手机上丢失数据是一个很大的错误。但是&#xff0c;在这种情况下&#xff0c;除了惊慌失措之外&#xff0c;最好开始使用android数据恢复应用程序搜索以查找将其取回的方法。您可以检查手机的备份存储以在Android上进行数据恢复&#xff0c;但是如果数据仍然无处可寻&#xf…

elementui时间选择器time-picker返回值不对的问题

1. 问题 天杀的elementui的time-picker&#xff0c;导致我开发的系统出现了一次生产问题&#xff0c;原因竟然是因为组件库的bug&#xff01;直接上截图。 如图&#xff0c;正常情况下&#xff0c;选择时间后&#xff0c;想要得到的值理应是当天的时间&#xff0c;如图是当年…

什么是AI网关?AI网关在企业系统中承担什么角色?

AI 大模型的发展正在推动各行业的增长&#xff0c;据有关报告显示&#xff1a;“未来十年内预计年均增长率将达到37.3%&#xff0c;全球企业预计在2027年之前将在AI领域投入8000亿美元"。这一迅猛发展促使许多企业进行战略转型&#xff0c;技术团队也需要调整其构建、运行…

牛客编程初学者入门训练——BC17 缩短二进制

BC17 缩短二进制 描述 我们处理的整数通常用十进制表示&#xff0c;在计算机内存中是以二进制补码形式存储&#xff0c;但通常二进制表示的整数比较长&#xff0c;为了便于在程序设计过程中理解和处理数据&#xff0c;通常采用八进制和十六进制&#xff0c;缩短了二进制补码表…

Spark高级用法-自定义函数

用户可以根据需求自己封装计算的逻辑&#xff0c;对字段数据进行计算 内置函数&#xff0c;是spark提供的对字段操作的方法 &#xff0c;split(字段) 对字段中的数进行切割&#xff0c;F.sum(字段) 会将该字段下的数据进行求和 实际业务中又能内置函数不满足计算需求&#xff0…

AI如何对产品设计带来更多的可能性?

AI(人工智能)对产品设计带来了广泛而深远的可能性&#xff0c;这些可能性主要体现在以下几个方面 1.创新设计的激发 创意生成:AI能够学习和模仿人类设计师的创作过程&#xff0c;通过深度学习等技术生成全新的、独特的设计概念。这些概念可能源于对大量设计案例的学习和分析&am…

AMD在Advancing AI发布会上发布三大核心硬件产品,挑战英伟达AI芯片市场

美国时间10月10日&#xff0c;AMD在旧金山召开了Advancing AI发布会。 这是老对手英伟达2024 AI Summit 结束后的第三天。与英伟达大会的不同之处在于&#xff0c;英伟达专注于软件方面的更新&#xff0c;而AMD主打“硬”牌。 这一次&#xff0c;他们带来了三款核心硬件产品&…

Python 批量转换 Shapefile 为 GeoJSON

批量转换 Shapefile (.shp) 为 GeoJSON 文件的脚本详解 &#x1f5fa;️&#x1f504; 在地理信息系统&#xff08;GIS&#xff09;和遥感领域&#xff0c;Shapefile&#xff08;.shp&#xff09;格式与GeoJSON格式是两种常用的数据格式。Shapefile 作为矢量数据的标准格式之一…

使用scss生成旋转圆圈

图片 html代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

直播相关04-录制麦克风声音, 通过编程录音

一 通过编程录音 开发录音功能的主要步骤是&#xff1a; 注册设备获取输入格式对象打开设备采集数据释放资源 需要用到的FFmpeg库有4个。 extern "C" { // 设备相关API #include <libavdevice/avdevice.h> // 格式相关API&#xff0c;也就是说&#xff0c;win…

Mysql(2)—SQL语法详解(通俗易懂)

一、关于SQL 1.1 简介 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理关系型数据库的标准编程语言。它主要用于数据的查询、插入、更新和删除等操作。SQL最初在1970年代由IBM的研究人员开发&#xff0c;旨在处理关系数据模型…

Python基础常见面试题总结

文章目录 1.深拷贝与浅拷贝2.迭代器3.生成器4.装饰器5.进程、线程、协程6.高阶函数7.魔法方法8.python垃圾回收机制 1.深拷贝与浅拷贝 浅拷贝是对地址的拷贝&#xff0c;只拷贝第一层&#xff0c;第一层改变的时候不会改变&#xff0c;内层改变才会改变。深拷贝是对值的拷贝&a…

【第十六周】回顾线性回归与逻辑回归以及它们的详细推导过程

目录 摘要Abstract1.线性回归1.1.一元线性回归1.1.1.函数凹凸性判断 1.2.多元线性回归1.3.进一步理解梯度下降法 2.逻辑回归2.1.信息论角度推导交叉熵损失函数2.2.概率论角度推导交叉熵损失函数 3.额外阅读&#xff1a;Label Smoothing3.1.One-hot 和 Label Smoothing 的优缺点…