API 日志与 JSON 脱敏工具
遮蔽匹配值,再核对剩余内容。请使用合成或已获准的输入。
留空时使用下方默认模式。未加锚点时按子串匹配。 password|secret|token|api_key|credit_card|auth|ssn
匹配可能遗漏秘密,也可能遮蔽无害内容。分享前请检查整个输出,包括 JSON 键名。
待复核的遮蔽文本
-- 输入内容后检查匹配结果
四组遮蔽案例与限制
载入会同时替换输入与键名表达式。预期文本与计数在 JavaScript 运行前也可阅读。
解码邮箱、嵌套键与 Token 形态文本
Unicode 转义的邮箱分隔符解码后才匹配邮箱。auth 对象整体替换计一次,不扫描子项。两个 IP、Bearer 文本、JWT 形态与 password 合计七次操作。
键名表达式(忽略大小写): password|secret|token|api_key|credit_card|auth|ssn · 替换操作次数: 7
输入日志或 JSON
{
"request": {
"email": "ada\u0040example.com",
"ip": "192.0.2.7",
"ipv6": "2001:db8::1",
"auth": {
"token": "DEMO_ONLY",
"note": "not exported"
}
},
"events": [
{
"message": "Bearer demo-token"
},
{
"value": "eyJhbGciOiJub25lIn0.eyJzdWIiOiIxIn0.c2ln"
}
],
"password": "DEMO_ONLY",
"ok": true
}
预期输出
{
"request": {
"email": "[REDACTED_EMAIL]",
"ip": "[REDACTED_IP]",
"ipv6": "[REDACTED_IP]",
"auth": "[REDACTED]"
},
"events": [
{
"message": "Bearer [REDACTED_TOKEN]"
},
{
"value": "[REDACTED_JWT]"
}
],
"password": "[REDACTED]",
"ok": true
}
JWT 是合成字符串,不验证签名。替换父项不会统计其中每个隐藏秘密。
纯文本日志:命中、误匹配与遗漏
六次操作遮蔽一个邮箱、三个 IP 形态值、Bearer 文本和 JWT 形态。版本号也被遮蔽;时间、不透明 Token、本地域邮箱和无效 IP 仍显示。
键名表达式(忽略大小写): password|secret|token|api_key|credit_card|auth|ssn · 替换操作次数: 6
输入日志或 JSON
email=ada@example.com
ipv4=192.0.2.7
ipv6=2001:db8::1
auth=Bearer demo-token
jwt=eyJhbGciOiJub25lIn0.eyJzdWIiOiIxIn0.c2ln
version=1.2.3.4
time=12:30:45
opaque=demo-session-token
local_email=name@localhost
bad_ip=999.1.1.1
预期输出
email=[REDACTED_EMAIL]
ipv4=[REDACTED_IP]
ipv6=[REDACTED_IP]
auth=Bearer [REDACTED_TOKEN]
jwt=[REDACTED_JWT]
version=[REDACTED_IP]
time=12:30:45
opaque=demo-session-token
local_email=name@localhost
bad_ip=999.1.1.1
文本匹配不理解日志语义。像地址的值可能无害,而遗漏的不透明 Token 可能敏感。
精确匹配键名并保留属性名称
锚定表达式只匹配 secret;author、__proto__、constructor 和两个邮箱键名均保留,敏感属性值替换一次。
键名表达式(忽略大小写): ^secret$ · 替换操作次数: 1
输入日志或 JSON
{
"author": "Ada",
"__proto__": {
"note": "keep"
},
"constructor": "own",
"a@example.com": 1,
"b@example.com": 2,
"public_note": "DEMO_PUBLIC",
"secret": "DEMO_SECRET"
}
预期输出
{
"author": "Ada",
"__proto__": {
"note": "keep"
},
"constructor": "own",
"a@example.com": 1,
"b@example.com": 2,
"public_note": "DEMO_PUBLIC",
"secret": "[REDACTED]"
}
用作属性名的邮箱仍会显示。默认 auth 子串还会匹配 author。
无效表达式阻止部分结果
单个左方括号不是有效表达式。处理会报错并清空输出和计数,不提供部分遮蔽文本供复制。
键名表达式(忽略大小写): [ · 替换操作次数: 0
输入日志或 JSON
{ "email": "ada@example.com", "password": "DEMO_ONLY" }
修正表达式可恢复处理,但表达式有效不代表检测完整。
分享前检查模式匹配结果
粘贴合成或已获准使用的日志,核对键名表达式,再比较遮蔽文本与替换次数。有效 JSON 先解析:字符串值解码后再匹配,匹配键的整个值会被替换。其他输入仅作有限文本匹配。复制前请检查漏项。
默认键名表达式忽略大小写,按子串匹配。父键整体替换只计一次,不再扫描子项。JSON 输入会重排为两个空格缩进。无效表达式会报错、清空输出并阻止复制。
使用边界与限制条件
- 这是尽力匹配,不是 DLP、匿名化或可安全分享保证。不透明 Token、特殊邮箱格式、编码或拆分后的秘密及其他标识符可能保留,请检查整个结果。
- JSON 键名保持原样,避免不同键被替换成同名后丢失字段。因此作为键名的邮箱等敏感名称仍会显示,分享前需另行遮蔽或改名。
- 默认 auth 子串也会匹配 author;类似 IPv4 的版本号 1.2.3.4 会被遮蔽。JWT 形态匹配不校验签名或声明;合法 IP 形态也不代表真实客户端地址。
- 纯文本或损坏的 JSON 只做文本模式匹配和有限的带引号键名标量替换。无引号键及对象、数组值可能遗漏。文本模式标签不证明 JSON 有效或脱敏完整。
- 计数是替换操作次数,不是独立人员数或被替换父对象内的秘密总数。文本模式有些命中会在后续父键替换前被计数。零次替换不代表没有敏感数据。
- JSON.parse 使用 JavaScript 数值,大整数可能丢失精度;未遮蔽的非有限 JSON 数值会报错。自定义表达式与转换运行在主线程,复杂表达式或大输入可能让页面变慢或无响应。
- 转换代码在浏览器运行;本地检查没有验证全部脚本或部署站点。请遵守所在组织的数据规则;处理输出与复制需要 JavaScript。
常见问题与技术解答 (FAQ)
JSON 脱敏能识别转义邮箱与嵌套值吗?▼
有效 JSON 先解析,因此 Unicode 转义的邮箱分隔符会成为邮箱字符。数组和对象会递归处理;匹配父键时整个值被替换,不再扫描子项。属性名称保持原样。
为什么 author 或版本号被遮蔽?▼
默认表达式按子串匹配,auth 也会命中 author。类似 IPv4 的版本号无法仅凭这种模式与地址区分。可使用锚定的键名表达式,并同时核对误匹配和漏匹配。
不完整 JSON 日志的文本模式表示什么?▼
输入未解析为 JSON。通用文本模式和带引号键名的标量替换仍可执行,但对象、数组值和无引号字段可能遗漏。请修复 JSON 或人工检查剩余文本。
遮蔽后的结果能保证安全分享吗?▼
不能。模式可能漏掉不透明、编码后或未识别的秘密,JSON 敏感键名也会保留。替换计数不是安全评分。请逐字段复核并遵守数据分享规则。