Leectan/secretshields

GitHub: Leectan/secretshields

本地优先的 VS Code/Cursor 扩展,在用户粘贴前自动检测并屏蔽剪贴板中的 API 密钥和 Token,防止敏感凭证意外泄露到 AI 聊天等外部环境。

Stars: 1 | Forks: 0

# SecretShields — AI 聊天的密钥护盾 [![VS Code Marketplace](https://img.shields.io/visual-studio-marketplace/v/secretshields.secretshields?label=VS%20Code%20Marketplace&color=blue)](https://marketplace.visualstudio.com/items?itemName=secretshields.secretshields) [![OpenVSX](https://raw.githubusercontent.com/Leectan/secretshields/main/)](https://open-vsx.org/extension/secretshields/secretshields) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/ad/ad5834178f7599af9fdda11629d49cae07f2997beec49821b2920eff5bfd50e7.svg)](https://github.com/Leectan/secretshields/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](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, 信息遮蔽, 剪贴板, 开发工具, 数据防泄露, 自动化攻击