秘密脱敏工具
秘密脱敏工具会扫描你即将分享的文本——日志摘录、支持工单、聊天消息、配置转储——并在其他人读到之前移除藏在其中的凭据。把文本粘贴进来或把文件拖进来,它会找出服务商 API 密钥、访问令牌、私钥块、JSON Web Token、银行卡号和电子邮件地址,在表格中以打码形式列出每一处命中,并生成一份干净的副本,其中每个秘密都被替换为 [REDACTED]。一切都在浏览器中 100% 本地运行:不会上传任何内容,不会存储任何内容,扫描文本不会发出任何网络请求。配套指南在粘贴之前先脱敏你的秘密解释了扫描器能捕获什么、不能捕获什么;对于浏览器抓取,请使用 HAR 分析器;对于配置文件,请使用 .env 解析器。
最后更新:
或将文本文件拖到此框的任意位置。限制:2 MB。文件仅在本设备上读取,永远不会被上传。
扫描结果
高亮预览(已打码)
发现的问题
扫描器寻找什么——以及它如何判断
大多数秘密不是通过攻击泄露的,而是通过热心帮忙泄露的。有人把日志粘贴进工单,把配置文件粘贴进聊天,把 curl 命令粘贴进论坛帖子——碰巧藏在里面的凭据就随之而去,进入那些会索引、转发并永久归档文本的系统。本页就是那次粘贴之前的暂停。输入或拖入文本,扫描会随着输入实时进行:计数条按类型汇总发现的问题,预览在原位置高亮每一处命中并将其值打码,发现表格列出类型、打码形式和行号,下方的脱敏副本把每一处命中替换为统一标记 [REDACTED],可以复制,也可以下载为 .txt 文件。
第一层检测靠的是形状。真实服务商的真实凭据有可识别的形状,扫描器认识其中主要的几种:AWS 访问密钥、经典与细粒度两种形式的 GitHub 令牌、Stripe 秘密密钥与受限密钥、OpenAI 项目密钥与通用密钥、Anthropic 密钥、Google API 密钥和 Slack 令牌。私钥块作为一个整体命中被捕获——从它的 BEGIN 行到 END 行——因为只脱敏密钥块的一部分仍然会留下一把可用的密钥。JSON Web Token 靠其三段 base64url 结构被识别,银行卡号必须通过 Luhn 校验和才会被标记,这样普通的订单号和时间戳就不会误报。
熵、占位符与诚实的局限
第二层覆盖那些没有服务商形状的秘密:形如 password = …、api_key: … 或 client_secret = … 的赋值。一个光秃秃的关键字什么也证明不了,所以值必须再过两道门——至少十二个字符,以及每字符至少 3.2 比特的香农熵,随机密钥很容易通过,普通单词则会失败。占位符值按设计被排除:任何包含 example、test、dummy、xxx、your-、placeholder 或 changeme 的内容都是文档,而不是凭据,标记它只会训练你无视扫描器。当形状重叠时,具体的模式胜出:被赋值给变量的 Stripe 密钥只报告一次,类型就是 Stripe 密钥。
有两种发现保护的是人,而不是系统。电子邮件地址被标记为个人数据,因为一整张写满客户地址的工单即使没有出现任何密码,也是一次隐私事件。银行卡号只在数字通过 Luhn 时才标记,Luhn 是每一张真实银行卡号内建的校验和——正是这个检验让扫描器可以忽略那些只是看起来又长又有数字的发票号、追踪代码和 Unix 时间戳。在屏幕上,每个值最多打码到只显示前四个字符,因此偷看屏幕的人或一张截图只能知道秘密的类型和位置,永远学不到秘密本身;短值则什么都不显示。完整的值只存在于你的原始文本中,而它从不离开本页。
请把脱敏工具当作一种更安全的分享习惯中的一步,而不是一种保证。在本地脱敏,分享脱敏副本,而当秘密确实必须交到他人手中时,通过秘密管理器或过期的分享链接发送真正的秘密——永远不要与脱敏文本走同一张工单或同一个聊天。如果某个真实凭据已经被未脱敏地粘贴到了某处,删除那条消息是不够的:副本、索引和通知可能已经存在,因此请轮换该凭据,并把旧的当作已经公开。配套文章在粘贴之前先脱敏你的秘密完整地介绍了这一流程;HAR 分析器为浏览器抓取做同样的事情,.env 解析器则在你提交配置文件之前检查它们。
用通俗的话说明检测库
| AWS 访问密钥 | AKIA 或 ASIA 后跟恰好 16 个大写字母或数字——长期与临时 AWS 访问密钥 ID 的形状。 |
| GitHub 令牌 | ghp_、gho_、ghu_、ghs_ 和 ghr_ 前缀再加至少 36 个字符,以及细粒度的 github_pat_ 形式。 |
| Stripe 密钥 | sk_ 或 rk_ 后跟 live_ 或 test_ 以及至少 16 个字母数字字符——秘密密钥与受限密钥,测试模式也包括在内,因为测试密钥会暴露账户结构与习惯。 |
| OpenAI 与 Anthropic 密钥 | sk-proj- 项目密钥和 32 个字符以上的通用 sk- 密钥计为 OpenAI;sk-ant- 密钥报告为 Anthropic——一种单独的类型,一条单独的轮换路径。 |
| Google API 密钥与 Slack 令牌 | Google 是 AIza 后跟 35 个字符;Slack 是 xoxb、xoxa、xoxp、xoxr 和 xoxs 前缀,分别对应机器人、应用、用户、刷新和会话令牌。 |
| 私钥块 | 一整块 PEM,从 -----BEGIN PRIVATE KEY-----(包括 RSA、EC、OpenSSH 和 PGP 变体)到对应的 END 行,作为一处命中报告和脱敏。 |
| JSON Web Token | 由点分隔的三段 base64url,前两段以 eyJ 开头——每个 JWT 都以这种 JSON 标头与载荷的编码形式开头。 |
| 通用赋值 | 赋值给 api_key、secret、token、password、passwd、auth_token、access_token 或 client_secret 等名称的值,仅当值至少 12 个字符且香农熵达到 3.2 时才标记;文档占位符从不标记。 |
| 电子邮件地址 | 普通的电子邮件地址,作为个人数据(PII)报告,使客户或员工地址的大量粘贴在扩散之前被抓住。 |
| 银行卡号 | 13 到 19 位的数字序列,允许空格和连字符,仅当通过每张真实卡都满足的 Luhn 校验和时才标记。 |
| 打码与标记 | 在屏幕上,一个值最多显示前四个字符加省略号,四个字符或更短的值什么都不显示。在脱敏副本中,每处命中都变成统一标记 [REDACTED];类型在发现表格中可见,从不内联显示。 |
常见问题
我的文本会被上传或存储到任何地方吗?
不会。扫描在本页、你的设备上运行:任何内容都不会被上传、传输或存储,扫描不会发出任何网络请求。这是一条刻意的设计规则——一个要求你先上传满是秘密的文本再来移除秘密的工具,本身就是问题的一部分。
它能找到哪些种类的秘密?
服务商形状的凭据——AWS 访问密钥,以及 GitHub、Stripe、OpenAI、Anthropic、Google 和 Slack 的密钥与令牌——加上完整的私钥块、JSON Web Token、赋值给 password 或 api_key 等名称的高熵值、电子邮件地址,以及通过 Luhn 校验和的银行卡号。上面的事实表用通俗的话列出了每一种模式。
为什么它漏掉了我能在文本中看到的秘密?
有三个诚实的原因。值可能被拆到多行或被折行,因此没有单一形状能匹配。它可能是一个低熵的人类口令,被赋值给通用规则不认识的名称。或者它可能是一种尚无模式覆盖的格式——数据库连接串、Cookie 值、基本认证 URL。扫描器以确定性的方式捕获那些常见、文档齐全的形状;它是一张安全网,而不是文本已经干净的证明,所以在分享之前请自己快速浏览一遍预览。
为什么它标记了并不是真正秘密的东西?
通常是因为那个值确实长得像秘密:一个没有占位符措辞的、看起来很随机的测试值、内部文档中的示例令牌,或被用作前端示例的 JWT。分享之前先看一眼发现表格——一次误报只花一眼,而一次漏报要花一次轮换。包含 example、test、dummy、xxx、your-、placeholder 或 changeme 的值从不被标记,因此把样本这样标明可以减少噪声。
如果原文已经泄露,脱敏能让秘密安全吗?
不能。脱敏保护的是你从现在起制作的副本;它无法召回一份已经带着秘密发出的工单、聊天消息或日志。把任何曾经未脱敏地出现在共享系统中的凭据当作公开的:在服务商处轮换它、吊销旧的,然后才分享脱敏后的文本。配套文章在粘贴之前先脱敏你的秘密解释了先轮换的顺序,以及为什么仅仅删除消息是不够的。