使用正则表达式对 JSON 字符串中的敏感字段进行脱敏,可以按照以下步骤操作:✅ 1. 确定需要脱敏的字段例如:"password", "phone", "id" 等。✅ 2. 编写正则表达式匹配字段假设 JSON 格式为:{ "username": "admin", "password": "123456", "phone": "13800000000" }目标是将 password
时间:2026-05-13 22:51:28 390浏览 收藏
本文深入探讨了如何在不解析JSON结构的前提下,安全高效地使用正则表达式对原始JSON字符串中的敏感字段(如password、phone、idCard、email等)进行精准脱敏,既适用于日志预处理、网关过滤等轻量场景,又通过惰性匹配、多类型值识别、注释预清理、转义字符兼容及格式保留等关键技巧规避常见陷阱,帮助开发者在兼顾性能与安全的同时,避免误匹配、格式破坏和数据泄露风险。

直接对原始 JSON 字符串(未解析为对象)用正则表达式脱敏,是可行但需谨慎的方案——适用于无法或不希望解析 JSON 的轻量场景(如日志预处理、网关层快速过滤),但必须避开 JSON 结构陷阱(如嵌套、引号转义、字段名重复等)。核心思路是:**精准匹配键名 + 安全捕获值 + 保留原始格式**。
识别敏感字段的键值对模式
不能简单写 "phone": "138...",因为 JSON 中键名和值可能跨行、含空格、有转义引号。推荐使用惰性匹配 + 带边界的模式:
- 基础结构:
"\s*(phone|idCard|email|password)\s*"\s*:\s*("([^"\\]|\\.)*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?) - 说明:匹配双引号包裹的敏感键名(忽略周围空白),冒号后允许空白,再匹配字符串(支持转义)、布尔、null 或数字;用非贪婪
[^"\\]*防止跨字符串误匹配 - 注意:不匹配单引号 JSON(非标准),也不处理键名带转义(如
"\"phone\""),这类极少,若存在需前置预清理
对不同值类型执行差异化脱敏
值的类型决定脱敏方式,正则需分组捕获并判断:
- 字符串值(第3组匹配内容):保留开头2位 +
"****"+ 末尾1位(如"138****0001");邮箱可留用户名首尾+域名("u***@domain.com") - 数字/布尔/null:数字可替换为
0或***;布尔统一为false;null 保持不变或替为null - 实现提示:在 replace 回调中用
if (match[3]) {...}判断是否为字符串,避免误脱敏数字
规避 JSON 结构风险的关键细节
原始字符串操作易出错,以下三点必须处理:
- 跳过注释与字符串内内容:JSON 标准无注释,但实际日志中可能出现
//或/* */。若存在,需先移除注释(用正则/\/\*[\s\S]*?\*\/|\/\/.*/g),否则可能把注释里的"phone"当成字段脱敏 - 防止匹配到值中的键名:例如
"content": "user phone: 138..."。通过要求键名前后必须是"+ 空白 +:(即"\s*key\s*"\s*:)来降低误伤 - 保留原始缩进与换行:replace 时用
$&(整个匹配)做占位,只替换值部分,确保 JSON 格式不变,利于后续解析或展示
一个可用的 JavaScript 示例
以脱敏 phone、idCard、email 为例:
const sensitiveKeys = ['phone', 'idCard', 'email'];
const pattern = new RegExp(
'"\\s*(' + sensitiveKeys.join('|') + ')\\s*"' + // 匹配键
'\\s*:\\s*' + // 冒号及空格
'(' + // 值(捕获组2)
'"([^"\\\\]|\\\\.)*"' + // 字符串(支持转义)
'|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+-]?\\d+)?' + // 其他字面量
')',
'g'
);
<p>function desensitizeJSON(jsonStr) {
return jsonStr.replace(pattern, (match, key, value) => {
if (value.startsWith('"')) {
const inner = value.slice(1, -1); // 去掉引号
let masked;
if (key === 'phone') masked = inner.length > 4 ? inner.substring(0, 3) + '<strong><strong>' + inner.slice(-1) : '</strong></strong>';
else if (key === 'idCard') masked = inner.length > 16 ? inner.substring(0, 4) + '<strong>****</strong>' + inner.slice(-4) : '<strong>****</strong>';
else if (key === 'email') {
const [user, domain] = inner.split('@');
masked = user ? (user[0] + '<strong><em>@' + (domain || '')) : '</em></strong>@<strong><em>';
}
return <code>"${key}": "${masked}"</code>;
}
return `"${key}": "</em></strong>"`; // 非字符串值统一掩码
});
}</p>理论要掌握,实操不能落!以上关于《使用正则表达式对 JSON 字符串中的敏感字段进行脱敏,可以按照以下步骤操作:✅ 1. 确定需要脱敏的字段例如:"password", "phone", "id" 等。✅ 2. 编写正则表达式匹配字段假设 JSON 格式为:{ "username": "admin", "password": "123456", "phone": "13800000000" }目标是将 password 和 phone 脱敏为 **** 或 ***。✅ 3. 正则表达式示例(以 Python 为例)a. 匹配 password 字段import re json_str = '{"username": "admin", "password": "123456", "phone": "13800000000"}' # 替换 password 字段 pattern_password = r'"password"\s*:\s*"([^"]*)"' replaced_json = re.sub(pattern_password, r'"password": "***"', json_str)b. 匹配 phone 字段 pattern_phone = r'"phone"\s*:\s*"([^"]*)"' re》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!
-
502 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
212 收藏
-
495 收藏
-
427 收藏
-
459 收藏
-
281 收藏
-
130 收藏
-
484 收藏
-
105 收藏
-
354 收藏
-
459 收藏
-
255 收藏
-
296 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习