Leectan/secretshields
GitHub: Leectan/secretshields
本地优先的 VS Code/Cursor 扩展,在用户粘贴前自动检测并屏蔽剪贴板中的 API 密钥和 Token,防止敏感凭证意外泄露到 AI 聊天等外部环境。
Stars: 1 | Forks: 0
# SecretShields — AI 聊天的密钥护盾
[](https://marketplace.visualstudio.com/items?itemName=secretshields.secretshields)
[](https://open-vsx.org/extension/secretshields/secretshields)
[](https://github.com/Leectan/secretshields/actions/workflows/ci.yml)
[](https://opensource.org/licenses/MIT)
SecretShields 是一个本地优先的 VS Code / Cursor 扩展,它会在您将密钥(secret)粘贴到任何地方之前自动屏蔽剪贴板中的密钥——包括 AI 聊天窗口、终端和 pastebin。
## 工作原理
1. **复制**包含密钥的文本(API key、token、数据库 URL 等)
2. **SecretShields 检测**到密钥的时间约为 1 秒(可通过 `pollIntervalMs` 配置),并将您的剪贴板内容替换为屏蔽后的版本
3. **粘贴**到任何地方都是安全的——密钥已被屏蔽
4. **恢复**(可选)——如果您确实需要原始密钥,请在短时间窗口内将其恢复。此操作会触发轮换提醒。
## 功能特性
- **自动屏蔽剪贴板**——复制后约 1 秒内检测并屏蔽密钥(基于轮询,可配置)
- **涵盖 30 多个平台的 38 种检测模式**——AWS、GitHub、Stripe、OpenAI、Anthropic、Google、Vercel、Slack、SendGrid、Shopify、Twilio、DigitalOcean、npm、PyPI、HashiCorp Vault、Doppler、Linear、Grafana、New Relic、Heroku、PlanetScale、Docker Hub、Resend、Supabase、Netlify、Appwrite、Cloudflare、Discord、数据库 URL、SSH 密钥、JWT 等
- **低误报设计**——已知示例值的白名单、Shannon 熵过滤、JWT 结构验证、数据库 URL 的占位符密码检测、模板变量过滤以及针对特定模式的验证钩子
- **按检测器开关**——可通过设置单独启用或禁用每个平台的检测
- **基于 TTL 的恢复**——在短时间窗口内(可配置,默认 60 秒)特意恢复被屏蔽的密钥
- **轮换提醒**——恢复密钥会启动倒计时;当倒计时结束时,您会收到提醒,其中包含指向服务商轮换页面的直接链接
- **暴露日志**——跟踪哪些密钥被暴露、何时被暴露以及是否已轮换
- **100% 本地运行**——无网络调用、无遥测、无数据离开您的设备
## 隐私模型
SecretShields 的设计将隐私作为核心功能:
- **无网络调用**——检测、屏蔽和警报完全在本地进行
- **不持久化存储原始密钥**——原始密钥仅在内存中短暂存在(用于恢复 TTL 窗口);持久化存储仅保存屏蔽后的预览和元数据
- **无遥测**——不会向任何地方发送任何内容
## 命令
| 命令 | 描述 |
| --------------------------------------------------- | ---------------------------------------------------- |
| `SecretShields: Mask Clipboard Now` | 手动屏蔽当前剪贴板内容 |
| `SecretShields: Restore Last Secret (Time-Limited)` | 恢复原始密钥(仅在 TTL 窗口内) |
| `SecretShields: Show Exposure Log` | 打开暴露日志面板 |
| `SecretShields: Clear Exposure Log` | 清除所有暴露历史 |
| `SecretShields: Mark Secret as Rotated` | 将暴露的密钥标记为已轮换 |
## 支持的平台
| 平台 | 模式 | 前缀 / 格式 |
| --------------- | ----------------------------- | ----------------------------------------------------- |
| AWS | Access Key ID, Secret Key | `AKIA...`, keyword-based |
| GitHub | Classic PAT, Fine-grained PAT | `ghp_`, `gho_`, `ghu_`, `ghs_`, `ghr_`, `github_pat_` |
| Stripe | Secret, Restricted, Webhook | `sk_live_`, `rk_live_`, `whsec_` |
| OpenAI | v1, v2/project | `sk-...T3BlbkFJ...`, `sk-proj-` |
| Anthropic | API Key | `sk-ant-api03-` |
| Google | API Key | `AIza` |
| Vercel | PAT, Blob token | `vcp_`, `vci_`, `vercel_blob_rw_` |
| Slack | Bot/user/app tokens, Webhooks | `xoxb-`, `xoxp-`, `xapp-`, hooks.slack.com |
| SendGrid | API Key | `SG.` |
| Shopify | Access Token | `shpat_`, `shpca_`, `shppa_`, `shpss_` |
| Twilio | API Key SID, Account SID | `SK`, context-based `AC` |
| DigitalOcean | PAT, OAuth, Refresh | `dop_v1_`, `doo_v1_`, `dor_v1_` |
| npm | Access Token | `npm_` |
| PyPI | Upload Token | `pypi-AgEIcHlwaS5vcmc` |
| HashiCorp Vault | Service, Batch tokens | `hvs.`, `hvb.` |
| Doppler | Personal, Service, CLI | `dp.pt.`, `dp.st.`, `dp.ct.` |
| Linear | API Key | `lin_api_` |
| Grafana | Service Account Token | `glsa_` |
| New Relic | User, Ingest, Browser | `NRAK-`, `NRII-`, `NRJS-` |
| Heroku | OAuth Token | `HRKU-` |
| PlanetScale | Token, Password, OAuth | `pscale_tkn_`, `pscale_pw_` |
| Docker Hub | PAT | `dckr_pat_` |
| Resend | API Key | `re_` |
| Supabase | Secret Key | `sb_secret_` |
| Netlify | PAT, CLI, OAuth | `nfp_`, `nfc_`, `nfo_` |
| Appwrite | Standard API Key | `standard_` + 256 hex |
| Cloudflare | Origin CA Key | `v1.0-` |
| Discord | Webhook URL | discord.com/api/webhooks |
| Database | URL with password | `postgresql://`, `mysql://`, `mongodb://`, `redis://` |
| SSH | Private Key | `-----BEGIN ... PRIVATE KEY-----` |
| JWT | JSON Web Token | `eyJ...` (structurally validated) |
## 设置
| 设置 | 默认值 | 描述 |
| ----------------------------------------- | ------------- | ------------------------------------------------------------------------ |
| `secretshields.enabled` | `true` | 剪贴板监控和编辑器粘贴屏蔽的总开关 |
| `secretshields.autoMask` | `true` | 自动屏蔽检测到的密钥 |
| `secretshields.restoreTTLSeconds` | `60` | 允许恢复原始密钥的秒数 |
| `secretshields.pollIntervalMs` | `1000` | 剪贴板轮询间隔(毫秒) |
| `secretshields.maskingSignal.mode` | `"statusBar"` | 始终可见的屏蔽反馈:`off`、`statusBar`、`output` 或 `both` |
| `secretshields.countdownMinutes.critical` | `15` | 关键密钥的轮换提醒(分钟) |
| `secretshields.countdownMinutes.high` | `60` | 高危密钥的轮换提醒(分钟) |
| `secretshields.countdownMinutes.medium` | `240` | 中危密钥的轮换提醒(分钟) |
| `secretshields.editorPasteMasking.mode` | `"offer"` | 编辑器粘贴屏蔽:`off`、`offer` 或 `auto` |
| `secretshields.detectors.*` | `true` | 特定平台的检测器开关(32 个开关) |
## 编辑器粘贴屏蔽
除了剪贴板屏蔽之外,SecretShields 还可以拦截代码编辑器中的粘贴操作:
- 当您将包含密钥的文本粘贴到代码编辑器中时,**粘贴小部件**会提供一个“使用 SecretShields 屏蔽粘贴”的选项
- 在 `offer` 模式(默认)下:普通粘贴仍然是默认选项;可以从粘贴小部件中选择屏蔽粘贴
- 在 `auto` 模式下:SecretShields 会尝试将屏蔽粘贴设为默认操作(尽最大努力,取决于其他粘贴提供程序)
- 在 `off` 模式下:SecretShields 完全不参与编辑器粘贴
- 如果 `secretshields.enabled` 为 `false`,无论模式设置如何,编辑器粘贴屏蔽都会被禁用
请在设置中通过 `secretshields.editorPasteMasking.mode` 进行配置。
**注意**:编辑器粘贴屏蔽仅在代码编辑器窗格中有效。它不适用于终端、聊天面板或基于 webview 的输入框。
## 反馈与支持
SecretShields 已上线并不断改进。请帮助我们完善它:
- **误报**(非密钥被屏蔽):打开一个 issue 并附上被屏蔽的文本模式(切勿包含真实密钥)。我们会将其添加到白名单中。
- **漏报**(真实密钥未被检测到):打开一个 issue 描述密钥格式(例如,“Acme Corp 的 API key 以 `acme_` 开头”)。我们会添加相应的检测模式。
- **临时禁用**:在 VS Code 设置中将 `secretshields.enabled` 设为 `false`,或在屏蔽通知中点击“禁用 SecretShields”。这将同时禁用剪贴板监控和编辑器粘贴屏蔽,直到您再次将其打开。
- 剪贴板屏蔽是**基于轮询的**——检测会在配置的 `pollIntervalMs`(默认 1000 毫秒)内发生,而不是在复制时瞬间发生。
## 局限性 (MVP)
- SecretShields 会主动屏蔽您的剪贴板。它**无法**直接拦截 Cursor 或 Copilot 聊天输入框内的粘贴事件(VS Code 扩展无法注入到其他扩展的 webview 中)。
- 编辑器粘贴屏蔽仅适用于代码编辑器窗格(TextDocuments),可通过 `secretshields.editorPasteMasking.mode` 进行配置。它是可选的,**不作为** AI 聊天核心保护的依赖——剪贴板优先屏蔽仍然是主要的防御手段。
- 轮换是手动的——SecretShields 会打开服务商的轮换页面,但不会自动轮换凭证。
## 禁用或卸载后
- **之前被屏蔽的剪贴板内容将保持屏蔽状态。** SecretShields 在被禁用或卸载时不会恢复原始密钥——这是有意为之的。在停用时恢复密钥会造成安全倒退。如果您的剪贴板中包含屏蔽后的文本,只需复制任何其他文本即可将其覆盖。
- **禁用/卸载可能需要重新加载窗口**,才能在当前会话中完全停止活跃的剪贴板监控。VS Code 的扩展宿主可能会继续运行,直到您重新加载窗口或重启 IDE。
- **其他打开的窗口会有影响。** 如果您打开了多个 VS Code 或 Cursor 窗口,任何仍在运行 SecretShields 的窗口都可以监控共享的系统剪贴板。
- **Cursor 自带的清洗工具是独立的。** Cursor 可能拥有自己内置的启发式机制,用于阻止密钥发送给 AI 服务商。这与 SecretShields 是分开的,并且无论是否安装了 SecretShields,它都会继续运行。
## 安装
从 VS Code Marketplace 或 OpenVSX(适用于 Cursor)安装。
## 许可证
MIT
标签:SOC Prime, 信息遮蔽, 剪贴板, 开发工具, 数据防泄露, 自动化攻击