字符串脱敏

在把 API 密钥、令牌、邮箱和账号粘贴到工单或聊天前先做遮蔽。可设置保留开头与结尾的字符数、遮蔽字符,以及是否隐藏真实长度。

分享密钥的「样子」,而不是密钥本身。 粘贴令牌、密钥、邮箱或账号,选择开头和结尾各保留多少字符。中间部分会被替换为遮蔽字符,同事可以确认你指的是哪一份凭证,却永远看不到它。

脱敏不是加密。如果密钥已经泄露,请轮换它,而不是把它打码。

脱敏是分享工具,不是安全控制

脱敏究竟保护了什么

把凭证的中段涂掉,能很好地解决一个很窄的问题:让你在不传输密钥的前提下谈论它。工单、缺陷报告、截图和聊天记录一直在泄露凭证,而起因往往只是有人需要确认「用的是哪一个」密钥,而不是「密钥是什么」。展示 sk_live_51H8...FgH 完整回答了前一个问题,对后一个则只字未提。

这就是它的全部价值,因此有必要把边界说清楚。脱敏是为人际沟通所做的单向、有损变换。它不是加密,因为没有密钥、也不打算还原;它不是哈希,因为它并不为抵抗什么而设计。它更像小票上只打印银行卡后四位:足以识别,不足以使用。

该露出多少

每多露一个字符,攻击者就少猜一个字符,所以在能完成识别任务的前提下,前后缀越短越好。对长随机令牌来说,两端各留四个字符是合理的默认值,多数服务商的控制台也是这么显示的。对短值要留得更少:八位 PIN 露出四位,几乎就什么都没剩下。

结构化的值需要额外斟酌,因为可见部分可能比看上去更有信息量。许多 API 密钥带有含义明确的前缀,而 sk_live_sk_test_ 的区分,通常正是你想保留的。邮箱地址则是相反的陷阱:保留域名一般没问题,但本地名加上一个小域名往往能定位到具体某个人,于是脱敏后的字符串又变回了个人信息。

本工具不允许首尾两个窗口重叠。如果两项设置加起来会覆盖整个字符串,它会自动收缩——因为重叠遮蔽的失败后果,是把原值完整打印出来。

长度泄露与固定宽度

保留长度的遮蔽也保留了信息。星号的个数会准确告诉读者密钥有多长,这既缩小了暴力破解的范围,也可能直接暴露凭证类型,因为很多密钥格式长度固定。对密码而言,公开长度是实实在在的让步。

固定宽度选项会把整个中段替换为固定数量的遮蔽字符,无视真实长度,于是所有脱敏结果看起来一样长。只要输出会被团队之外的人看到,就该启用它。当你和同事一起排查、长度本身具有诊断价值时(例如怀疑环境变量被截断),再使用保留长度的默认行为。

最后,请把它当作一个排版步骤,而不是事故响应。如果一个仍然有效的密钥已经出现在工单、日志或代码仓库里,给副本打码不会改变原始泄露的事实。请先轮换凭证,之后再对要粘贴的内容做脱敏。

开源说明:使用原生 JavaScript 实现,不依赖第三方库。

常见问题

脱敏后的文本能还原吗?
不能。被遮蔽的字符是被丢弃而不是被编码的,没有任何可解码的内容,只剩下你选择保留的可见字符。
应该保留多少个可见字符?
在仍能识别的前提下越少越好。长随机令牌两端各留四个比较合适;像 PIN 这样的短值应更少甚至完全不留。
固定宽度有什么作用?
它用固定数量的遮蔽字符替换中段,因此输出永远不会暴露真实长度。任何要分享到团队之外的内容都建议开启。
我的输入会发送到服务器吗?
不会。遮蔽完全由浏览器中的 JavaScript 完成,这也是可以放心在这里粘贴有效凭证的原因。
可以在遮蔽邮箱的同时保留辨识度吗?
可以,保留结尾字符即可让域名留存。但要注意:较短的本地名加上小域名,仍可能定位到具体某个人。
密钥泄露了,打码就够了吗?
不够。脱敏只影响你即将分享的这份副本。请先轮换已泄露的凭证,之后再对新消息使用脱敏。