关于 Secrets-LE
Secrets-LE 在源代码、配置和文本文件中查找疑似硬编码凭据,并可在编辑器中将其替换为占位符。扫描器按模式识别多类密钥和令牌,结果会遮蔽凭据值,适用于本地检查和 CI 安全检查。
主要功能
- 01识别密钥、令牌、密码和私钥
- 02按文件分组并标注位置
- 03结果中遮蔽凭据值
- 04编辑器内清理当前文件
- 05提供 CLI 与 MCP 接口
适用场景
- 01提交前检查工作区中的凭据
- 02在 CI 中扫描代码仓库
- 03定位并清理活动文件中的密钥
MCP 相关
MCP 服务通过 stdio 提供 detect_secrets,分析调用方提供的文本并返回类型、置信度、键名和位置;不会返回凭据值,也不会读取文件或发起网络请求。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| content | string | 是 | 要扫描的文本。 |
| maxResults | integer | 否 | 返回的问题数上限(默认 500)。meta.truncated 报告是否有结果被省略。 |
| sensitivity | enum | 否 | 要报告的发现项:"low" 报告所有匹配项,"medium"(默认值)会排除低置信度项,"high" 仅保留高置信度项。low | medium | high |
| includeTokens | boolean | 否 | 包含令牌检测器。 |
| includeApiKeys | boolean | 否 | 包含 API 密钥检测器。 |
| includePasswords | boolean | 否 | 包含密码检测器。 |
| includePrivateKeys | boolean | 否 | 包含私钥检测器。 |
详细介绍
Secrets-LE:轻松检测机密
查找工作区中的硬编码凭据,并就地将其脱敏
API 密钥、令牌、密码、私钥——100% 本地运行,不会有任何内容离开你的设备
觉得有用? 点赞或评分能帮助其他开发者发现它—— ★ GitHub · ★ Open VSX · ★ Marketplace
功能简介
打开工作区,运行 Secrets-LE: Detect Secrets,每个检测到的机密都会出现在结果文档中——按文件分组,并标出指向机密值本身的行号和列号。运行 Secrets-LE: Sanitize Secrets,即可将当前文件中的机密替换为占位符。可在 VS Code 以及 Cursor、VSCodium 等基于 VS Code 的编辑器中使用(可从 Open VSX 安装)。
检测基于正则表达式,针对每个文件的完整文本进行,因此适用于任何文本格式——代码、配置、.env 文件、YAML、JSON、日志。这是一道提交前的安全防线,并非万无一失:基于模式构建的扫描器可能会漏掉机密,也可能将非机密误判为机密。请检查检测结果。
安装
| 平台 | 功能 | 安装 |
|---|---|---|
| VS Code | 在编辑器中检测并就地脱敏 | Marketplace |
| Cursor、VSCodium、Windsurf | 相同的扩展 | Open VSX |
| 终端或 CI 步骤 | 对整个目录树运行相同的扫描,并返回退出码 | cargo install secrets-le · crates.io |
| 通过 Node 使用终端 | 相同的命令行,与 Rust 版本逐字节保持一致 | npx secrets-le · npm |
| 通过 Node 使用任意 MCP Agent | 通过标准输入输出运行 detect_secrets | npx secrets-le-mcp · npm |
在 AI Agent 中使用
同一引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,而不必由你运行命令。
| 编辑器 | 方法 |
|---|---|
| VS Code 1.101+ | 无需安装 — 此扩展会在 Agent 模式下注册 detect_secrets |
| Claude Code | claude mcp add secrets-le -- npx -y secrets-le-mcp |
| Cursor、Windsurf 及其他工具 | 将其指向 npx secrets-le-mcp |
detect_secrets(content, sensitivity?, includeApiKeys?, includePasswords?, includeTokens?, includePrivateKeys?, maxResults?)
每条发现都会报告其类型、置信度、键名和从 1 开始的位置。绝不会返回值 — 预览内容会被截断并标注长度,上下文行中的密钥也会被遮蔽,因此无需让凭据离开发现它的机器,就能定位发现项。
服务接收内容并返回数据 — 不会读取文件,也不会自行发起网络请求。它以 secrets-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/secrets-le 的名称发布在 MCP 注册表中。
手动配置 — 任何带有 MCP 配置文件的宿主
大多数宿主都读取 JSON 配置。添加一条配置项:
{
"mcpServers": {
"secrets-le": {
"command": "npx",
"args": ["-y", "secrets-le-mcp"]
}
}
}
-y 会跳过首次运行时的安装提示。如果你不想跟踪版本更新,可以固定版本 — [email protected]。
不想每次启动都通过 npx 运行?可以安装一次,然后指向该二进制文件:
npm install -g secrets-le-mcp
{
"mcpServers": {
"secrets-le": { "command": "secrets-le-mcp" }
}
}
它通过 stdio 使用 MCP 通信,无需环境变量、API 密钥或自身配置。将其接入任何工具之前,可以先进行检查:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y secrets-le-mcp
这会打印工具列表并退出 — 如果看到 detect_secrets,说明服务运行正常。
Detect 从磁盘读取文件,并按文件分组生成一份报告。
- 整个工作区:从命令面板运行
Secrets-LE: Detect Secrets。 - 单个文件夹:在资源管理器中右键单击该文件夹并选择
Detect Secrets in Folder,或运行Secrets-LE: Detect Secrets in Folder并选择一个文件夹。
# Secrets Detection Results
⚠️ Found 2 potential secret(s):
## 📄 .env (1 secret(s))
### PASSWORD (1)
- Line 1, Column 19
Key: database_password
Type: Password
Confidence: high
Value: hunter2… (14 chars)
Context: DATABASE_PASSWORD=hunter2… (14 chars)
## 📄 src/config.ts (1 secret(s))
### API-KEY (1)
- Line 1, Column 17
Key: apikey
Type: Generic API key
Confidence: high
Value: sk_demo_… (40 chars)
Context: const apiKey = "sk_demo_… (40 chars)";
---
# Warnings
- Not read: dependency folders, build output, caches and lockfiles; images, fonts, archives and other binary files; 1 file(s) ignored by .gitignore. The `secrets-le.workspace.*` settings change this.
扫描会读取哪些内容。 文件从磁盘读取,因此未保存的编辑内容不会被检测到。超过安全大小限制的文件,或非 UTF-8 文本文件,不会被读取。扫描最多处理 10,000 个文件或列出 10,000 个机密。报告末尾会逐项列出被跳过的内容。
即使 .gitignore 忽略了 .env 文件,扫描也会读取它们。 项目会在这些文件中保存机密,而运行此工具的目的就是检查这些内容。默认情况下,scanAlwaysInclude 包含 **/.env 和 **/.env.*。将其清空即可让 .gitignore 决定是否跳过这些文件。
跳过文件的扫描不能证明没有机密。 依赖项文件夹、.gitignore 忽略的其他文件或二进制文件中的机密不会被报告。要检查所有内容,请关闭这三个开关。
扫描会跳过哪些内容,以及如何更改。 默认情况下,三个开关均已开启,可分别在设置中关闭:
| 开关 | 跳过的内容 |
|---|---|
scanUseDefaultExcludes | 依赖项文件夹、构建输出、工具缓存和锁文件。完整列表见下文 |
scanRespectGitignore | 项目的 .gitignore 文件所忽略的内容 |
scanSkipBinaryFiles | 图片、字体、归档文件及其他非文本文件 |
两个列表可以在不关闭开关的情况下调整扫描结果。要跳过更多内容,请在 scanExcludes 中添加模式。要读取开关原本会跳过的内容,请将其添加到 scanAlwaysInclude:
{
// Also skip the test fixtures.
"secrets-le.workspace.scanExcludes": ["**/fixtures/**"],
// Keep reading .env files, and read the vendored code as well.
"secrets-le.workspace.scanAlwaysInclude": ["**/.env", "**/.env.*", "**/vendor/**"]
}
Secrets-LE: Open Settings 会在设置编辑器中打开以上所有设置。
内置列表
文件夹(无论出现在哪里):
.git、.hg、.svn、node_modules、bower_components、jspm_packages、.pnpm-store、.yarn、vendor、site-packages、Pods、Carthage、dist、build、out、target、_build、_site、dist-newstyle、zig-out、storybook-static、cdk.out、DerivedData、CMakeFiles、.next、.nuxt、.output、.svelte-kit、.angular、.astro、.docusaurus、.vuepress、.expo、.turbo、.parcel-cache、.cache、.sass-cache、.jekyll-cache、.dart_tool、.pub-cache、.gradle、.kotlin、.cxx、.externalNativeBuild、captures、ephemeral、.symlinks、.swiftpm、.build、.bundle、.stack-work、.zig-cache、.godot、elm-stuff、.vercel、.netlify、.serverless、.aws-sam、.terraform、.venv、venv、__pycache__、.tox、.nox、.mypy_cache、.pytest_cache、.ruff_cache、.ipynb_checkpoints、.eggs、coverage、htmlcov、.nyc_output、.vscode-test、.idea、.vs、xcuserdata、*.egg-info
文件(无论出现在哪里):
*.min.js、*.min.css、*.map、*.snap、*.lock、package-lock.json、pnpm-lock.yaml、npm-shrinkwrap.json、go.sum、*.pbxproj、*.iml、local.properties、output-metadata.json、.flutter-plugins、.flutter-plugins-dependencies、.packages、Generated.xcconfig、flutter_export_environment.sh、GeneratedPluginRegistrant.*、fastlane/report.xml、fastlane/test_output/**、doc/api/**
以下内容未列入,因为它们在许多项目中都是普通文件夹:bin、obj、tmp、logs、public、generated。如果项目会生成这些内容,通常会在 git 中忽略它们,而扫描会读取 .gitignore。
在“问题”面板中查看。 开启 secrets-le.workspace.scanProblemsEnabled 后,每个机密也会在所在行显示为警告。每次扫描都会替换上一次扫描的结果。消息会指出机密的类型,但不会显示其值。
影响扫描的设置位于设置中。
命令行工具
同样的检测也可在终端或 CI 步骤中运行:Rust 命令行工具位于
crate/,并与扩展共用同一张模式表
—— crate/signatures/patterns.toml ——
因此,两者对凭据的判定永远一致。同一命令行工具也以 secrets-le
的形式发布在 npm 上,供安装了 Node 但没有 Rust 的机器使用;CI 会在三种
操作系统上逐字节比对它与 crate,确保完全一致。
secrets-le . # scan a tree
secrets-le --sensitivity high . # only high-confidence findings
secrets-le --no-ignore --hidden . # reach .env and everything git ignores
secrets-le mcp # the same detection over MCP on stdio
从 npm 安装 (secrets-le) 或从 crates.io 安装 (secrets-le)。两种方式都会安装同一个 secrets-le 命令。
npm install -g secrets-le # or run it once: npx secrets-le
cargo install secrets-le
退出代码就是答案:0 表示未发现任何内容 · 1 表示发现问题 · 2 表示问题格式错误——因此,secrets-le . 可直接用作 CI 步骤。
它绝不会打印凭据。 扫描器的输出会进入 CI 日志,而日志会被归档,通常所有人都可读取,且留存时间比密钥更长;如果扫描器打印出发现的内容,就会让这些内容比提交本身暴露得更广。预览内容最多显示 8 个字符,且不超过值长度的一半;上下文行会经过遮蔽,也没有任何标志可以更改这些限制。扩展负责修复发现的问题;二进制工具只负责报告。
检测内容
共 34 种模式,定义于 crate/signatures/patterns.toml——这是两个前端都会加载的同一张表。
| 类别 | 类型 |
|---|---|
| 已命名发行方 | Anthropic sk-ant-、OpenAI sk-/sk-proj-、xAI xai-、Groq gsk_、Hugging Face hf_、Replicate r8_、GitHub ghp_/gho_/ghu_/ghs_/ghr_/github_pat_、GitLab、Slack xox?- 和 webhook URL、Discord webhook URL、Stripe sk_/rk_ 实时和测试密钥及 whsec_ webhook 密钥、Google AIza… 和 OAuth 客户端密钥 GOCSPX-、Linear lin_api_、DigitalOcean dop_v1_/doo_v1_/dor_v1_、Doppler dp.pt./dp.st.、SendGrid、Mailgun、Sentry、npm、PyPI、Docker Hub、HashiCorp Vault、Terraform Cloud、Supabase、Shopify、Square、Azure SAS |
| 云凭据 | AWS Access Key ID(AKIA…,无需密钥名称)、AWS Secret Access Key、Azure 账户密钥、GCP/Google Cloud 密钥 |
| 令牌 | 通用令牌、Bearer 令牌、访问令牌/刷新令牌、OAuth 令牌、JWT(基于密钥或裸 eyJ… 格式) |
| 密码 | password/passwd/pwd 值,包括复合键(DATABASE_PASSWORD) |
| 私钥 | 多行 PEM 块——RSA/EC、OpenSSH、PGP |
| 连接数据 | 嵌入 user:pass@ 凭据的数据库 URL、连接字符串、会话 ID、Cookie |
基于密钥的模式支持带引号和不带引号的键,因此 JSON("apiKey": "…")、YAML(api_key: …)、env(API_KEY=…)和代码(apiKey = '…')都能匹配。
有意不检测的内容:模板占位符(${VAR}、{{var}}、<your-key>、xxxxxxxx)、版本号以及仅仅看起来像点分格式的主机名(1.2.3 不是 JWT)、GCP 项目 ID(这是标识符,不是凭据),以及不含嵌入式凭据的数据库 URL。
已知限制:检测基于模式——经过混淆、拆分或命名不符合常规的密钥会被漏掉;标头不是标准 Base64 JSON(eyJ…)的 JWT 会被漏掉;没有可识别键名或前缀的高熵字符串不会被报告。
命令
| 命令 | 描述 |
|---|---|
Secrets-LE: Detect Secrets | 扫描工作区并打开结果文档 |
Secrets-LE: Detect Secrets in Folder | 对单个文件夹执行相同操作。也可在资源管理器中的文件夹上使用 |
Secrets-LE: Sanitize Secrets | 替换活动文件中检测到的密钥(会先请求确认) |
Secrets-LE: Open Settings | 打开 Secrets-LE 设置 |
Secrets-LE: Help | 内置文档 |
默认情况下,没有命令绑定快捷键。可在编辑器的 键盘快捷方式 中为任意命令设置快捷键。
设置
| 设置 | 默认值 | 描述 |
|---|---|---|
secrets-le.detection.sensitivity | medium | low 会报告所有内容,medium 会过滤低置信度匹配项,high 仅保留高置信度匹配项 |
secrets-le.detection.includeApiKeys | true | 检测 API 密钥和云凭据 |
secrets-le.detection.includePasswords | true | 检测密码 |
secrets-le.detection.includeTokens | true | 检测令牌和 JWT |
secrets-le.detection.includePrivateKeys | true | 检测 PEM 私钥块 |
secrets-le.sanitization.replaceWith | ***REDACTED*** | Sanitize 使用的替换文本 |
secrets-le.workspace.scanPatterns | ["**/*"] | 文件夹或工作区扫描时读取的文件 |
secrets-le.workspace.scanUseDefaultExcludes | true | 跳过依赖项文件夹、构建输出、缓存和锁文件 |
secrets-le.workspace.scanRespectGitignore | true | 跳过项目的 .gitignore 文件指定的内容 |
secrets-le.workspace.scanSkipBinaryFiles | true | 跳过图片、字体、压缩包和其他非文本文件 |
secrets-le.workspace.scanExcludes | [] | 以 glob 模式指定更多要跳过的文件 |
secrets-le.workspace.scanAlwaysInclude | ["**/.env", "**/.env.*"] | 即使上述三项设置会跳过,也要读取这些文件 |
secrets-le.workspace.scanMaxFiles | 10000 | 单次扫描读取的文件数上限 |
secrets-le.workspace.scanMaxResults | 10000 | 单次扫描停止读取前列出的密钥数上限 |
secrets-le.workspace.scanProblemsEnabled | false | 也在问题面板中显示扫描发现的密钥 |
secrets-le.safety.enabled | true | 为超大文件设置防护措施 |
secrets-le.safety.fileSizeWarnBytes | 1000000 | 跳过或拒绝超过此大小的文件 |
secrets-le.dedupeEnabled | false | 在结果中合并值和类型相同的检测项 |
secrets-le.showPositions | true | 显示发现的每个密钥所在的行和列 |
secrets-le.copyToClipboardEnabled | false | 同时将结果复制到剪贴板 |
secrets-le.clipboardIncludesPositions | true | 在复制内容中包含行和列 |
secrets-le.openResultsSideBySide | true | 在当前编辑器旁打开结果 |
secrets-le.notificationsLevel | important | all = 每条通知,important = 警告 + 错误,silent = 仅错误 |
secrets-le.statusBar.enabled | true | 显示状态栏项 |
secrets-le.telemetryEnabled | false | 仅本地事件日志(参见隐私) |
语言
除英语外,支持 12 种语言:
德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西) · 俄语 · 乌克兰语 · 越南语 · 简体中文
这两部分均已覆盖——清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏、快速选择项和提示词)。扩展会使用 VS Code 的显示语言,因此会与编辑器当前设置的语言一致;无需单独设置。
隐私与安全
- 不访问网络。 此扩展绝不会向任何地方发送数据。
telemetryEnabled设置只会将事件写入本地输出通道,供你查看(Secrets-LE Telemetry)。 - MCP 服务绝不会返回秘密信息。 它的输出会发送给调用它的任何模型,因此预览内容会截断并标注长度,周围的上下文行也会经过遮蔽,使用的正是报告中相同的
utils/mask辅助函数。没有任何参数可以关闭此功能;如果响应中出现任何值,构建检查就会失败——我们曾故意让工具泄露信息,并观察构建检查成功拦截。 - 错误通知会在显示前遮蔽主目录路径和类似凭据的片段。
- Sanitize 始终会在编辑文件前请求确认,且编辑是普通的、可撤销的文档编辑。
- 评分提示最多出现两次。 第 3 次成功使用时,扩展会询问你是否愿意评分;如果你选择 稍后 或关闭提示,则会在第 20 次使用时再询问一次。选择 不再询问 后,提示便会结束。将
notificationsLevel设为important或silent也会关闭提示。次数保存在 VS Code 的扩展存储中,不会发送到任何地方;选择 评分 会在浏览器中打开你安装时使用的列表页面——VS Code Marketplace 或 Open VSX。
文档
| 内容 | 位置 |
|---|---|
| 工具可以说什么——范围、输出约定、拒绝事项、非目标 | crate/SPEC.md |
| 扩展的构建与内部构成——架构、不变量、工具链、发布 | AGENTS.md |
| CLI 的构建与内部构成 | crate/AGENTS.md |
| 变更内容 | CHANGELOG.md · crate/CHANGELOG.md |
| 此工具的页面,以及另外 15 个工具 | letools.dev/tools/secrets-le |
性能
| 输入 | 大小 | 发现数量 | 用时 | 速率 | 扫描速度 |
|---|---|---|---|---|---|
| 含凭据的源码 | 1.97 MB | 40,000 | 132.32 ms | 302,301/sec | 14.9 MB/s |
| 干净的源码 | 1.92 MB | 0 | 70.88 ms | — | 27.2 MB/s |
| Env 文件 | 0.60 MB | 0 | 21.88 ms | — | 27.4 MB/s |
在 Apple M5 Pro、24 GB RAM、Node 24.3.0 上预热后运行 7 次所得的中位数。输入由
scripts/benchmark.ts 生成,并未提交到代码库,因此上述大小与实际测量值
完全一致。运行 bun run benchmark 可复现。
这些数据因机器而异,不会作为 CI 的断言——以基准测试结果作为构建门槛, 只能说明运行器当时有多忙。
测试
| 指标 | 覆盖率 |
|---|---|
| 语句 | 86.89% |
| 分支 | 78.60% |
| 函数 | 86.45% |
| 行 | 88.49% |
24 个文件中共有 412 个测试用例,另有一个在真实 VS Code 扩展宿主中运行的集成测试套件,
以及一个将构建好的 .vsix 安装到干净配置文件中的端到端测试。
数据由 scripts/coverage-readme.js 根据实际运行结果——coverage/coverage-summary.json 和
coverage/test-results.json——生成;如果此部分内容发生偏差,CI 就会失败。运行 bun run test:coverage 可复现,测试
用例数以 vitest 打印的数字为准。
LE 系列的更多工具
为每个模型眼前的工作打造的 16 款单一用途工具。每款都附带一个 Rust CLI 和一个 MCP 服务。一页尽览:letools.dev
提取
- String-LE — 提取代码库中的所有字符串,方便人工阅读
- Numbers-LE — 提取代码库中所有硬编码数字,方便人工检查
- Units-LE — 提取所有带单位的数量并统一格式,遇到含义不明确的数量时会按名称拒绝处理
- Dates-LE — 提取所有日期和时间戳,并给出每个日期和时间戳解析出的确切时刻
- IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
- IPs-LE — 提取所有 IP 地址、CIDR 网段和 MAC 地址,统一格式并按范围分类
- URLs-LE — 提取代码库中的所有 URL,并给出协议和确切位置
- Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向实际内容
- Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中
检查
- Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
- Versions-LE — 查找某个依赖项在仓库的各个清单文件中受到不同约束的位置
- i18n-LE — 识别项目使用的 i18n 库,然后依据该库的规则审查其目录
- Scrape-LE — 在编写抓取器之前检查网页能否抓取,并说明何时无法判断
防护
- Secrets-LE — 查找代码库中的硬编码凭据,绝不在报告中打印凭据
- EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
- Unicode-LE — 查找那些隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字系统
每款工具都独立运行:没有共享的 crate,也没有发布的核心库。若有两款工具得出相同结论,那是因为这个答案经得起两次验证。
联系 — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo 的其他项目
Rust — pixelcoords 和 pixelactions 构成一个工作循环:pixelcoords 回答 位置,pixelactions 在那里执行操作。它们有各自的工具、各自的风格——不属于 LE 系列。
- pixelcoords — 冻结屏幕,标记区域,获取像素级精确的坐标和裁剪图像 pixelcoords.dev · crates.io · docs.rs
- pixelactions — 使用经过人工验证的坐标执行交互,并确认操作已生效 pixelactions.dev · crates.io · docs.rs
许可证
MIT © nolindnaidoo
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。