SobralCybersec/APIKeyScanner

GitHub: SobralCybersec/APIKeyScanner

一款基于 Rust 的高性能 API 密钥扫描器,通过 70+ 检测模式、并发 GitHub 搜索和实时验证,帮助安全团队快速发现公开仓库中泄露的敏感凭证。

Stars: 5 | Forks: 1

Advanced Secret Finder

基于 Rust 的高性能 API 密钥扫描器,具备 70+ 种检测模式、并发 GitHub 扫描以及实时验证功能。通过上下文感知过滤和公开/私有输出分离,实现快速的仓库分析。 **英语语言**

What's New

* **30+ 种新的 API 模式**:xAI (Grok)、Groq、DeepSeek、Vercel、Supabase、Cloudflare、Databricks、Snowflake、Figma、LangSmith、Airtable * **降低误报率**:上下文感知过滤、3.5 熵值阈值、最小长度检查、占位符检测以及在适用情况下的 UUID 抑制 * **增强型验证**:支持对 OpenAI、Anthropic、xAI、Groq、DeepSeek、Vercel、Supabase、GitHub、Stripe 的实时验证以及 AWS 格式检查 * **Workflow 加固**:GitHub Actions 现已拆分 `verify` 和 `scan`,并在未配置 `SCANNER_TOKEN` 时干净利落地跳过实时扫描 * **认证/错误修复**:无效的 GitHub 凭证现在会如实报错 `401`,而不是静默显示为“0 个发现” * **公开输出的安全性**:`data/latest.json` 保留为公开构件,而私密发现则存放在被忽略的路径下 ### 核心数据 (2025-2026) * 2025 年 GitHub 上泄露了 **2865 万个密钥**(同比增长 34%) * 据报道,2026 年 1 月暴露了 **11.3 万个 DeepSeek 密钥** * 泄露后的中位利用时间不到 **4 分钟** * **97% 的泄露**与个人开发者工作流有关

Features

* **70+ API 密钥模式**:涵盖 OpenAI、Anthropic、Google、AWS、xAI、Groq、DeepSeek、Vercel、Supabase、GitHub、Stripe、Slack、SendGrid、Twilio、数据库 URL 等的检测范围 * **并发 GitHub 扫描**:多线程仓库扫描,支持请求预算控制、并发限制和分时段查询轮换 * **实时验证**:针对选定的提供商端点进行实时 API 密钥验证,并提供可选的已保存密钥测试 * **误报过滤**:占位符排除、熵分析、上下文感知匹配、UUID 筛选和最小长度检查 * **Google Dork 集成**:用于聚焦 GitHub 的机密搜寻模式的预配置搜索查询 * **交互模式**:分步启动器和 TUI 流程,用于 token 输入、扫描模式、验证和结果审查 * **公开/私有分离**:安全的发现结果存放于 `data/latest.json`;完整密钥存放于 `private_keys/full_keys.json` * **Workflow 验证**:CI 可以在没有真实凭证的情况下进行测试和构建;实时扫描仅在存在专用密钥时运行

Tech Stack

* **语言**:Rust 2024 Edition * **异步运行时**:Tokio * **HTTP 客户端**:Reqwest * **正则表达式引擎**:带有 lazy static 编译的 Regex crate * **CLI 框架**:Clap * **序列化**:Serde / Serde JSON * **终端用户体验**:Ratatui + Crossterm + Inquire * **归档**:Tar + Flate2,用于仓库 tarball 提取 * **并发**:Tokio semaphore + Futures stream 缓冲 * **GitHub API**:通过 Reqwest 直接调用 GitHub REST * **平台**:跨平台(Windows、Linux、macOS) * **构建系统**:Cargo

Installation & Setup

``` git clone https://github.com/yourusername/api-key-scanner.git cd api-key-scanner cargo build --release ``` ### 系统要求 - Rust stable 工具链 - 用于实时仓库扫描的 GitHub 身份验证 - 用于扫描和验证的网络连接 ### 配置 创建本地 `.env` 文件以供 CLI 使用: ``` GITHUB_TOKEN=github_pat_your_token_here ``` 对于 GitHub Actions 自动化扫描,请添加此仓库 secret: ``` SCANNER_TOKEN=github_pat_your_token_here ``` 注意事项: - 本地运行会从 `.env` 或 `--token` 读取 `GITHUB_TOKEN` - Workflow 使用 `SCANNER_TOKEN` 进行实时扫描 - 如果缺少 `SCANNER_TOKEN`,Workflow 仍会运行 `cargo test` 和构建验证,然后跳过实时扫描步骤 - GitHub 文档说明 `GITHUB_TOKEN` 可以在 Workflow 中验证 API 调用,但本项目保留了一个专用的 secret 用于代码搜索扫描,以使行为更可预测且更易于控制 ### 用法 ``` # 交互式启动器(未传递 flags 时的默认选项) cargo run # 使用您的 GitHub token 进行经典非 TUI 扫描 cargo run --release -- --token "$GITHUB_TOKEN" --max-requests 10 --no-tui # 交互式扫描配置 cargo run -- --interactive # 显示已配置的 dork/query patterns cargo run -- --show-dorks # 查看保存的 findings cargo run -- --view # 针对 provider endpoints 测试已保存的 keys cargo run -- --test-keys ```

Detected Patterns (70+)

### AI/ML 提供商 (15) | 提供商 | 模式 | 示例格式 | |----------|---------|----------------| | OpenAI | `sk-proj-...`, `sk-svcacct-...`, `sk-admin-...`, `sk-...` | `sk-proj-abc123...` | | Anthropic | `sk-ant-...` | `sk-ant-api03-xyz...` | | Google AI | `AIza[0-9A-Za-z_-]{35}` | `AIzaSyD...` | | xAI (Grok) | `xai-[A-Za-z0-9_-]{20,}` | `xai-abc123...` | | Groq | `gsk_[A-Za-z0-9]{40,}` | `gsk_xyz789...` | | DeepSeek | env 和 `sk-...` 键控匹配 | `sk-abc123...` | | Cohere | 基于 env 的上下文匹配 | `COHERE_API_KEY=...` | | Hugging Face | `hf_[A-Za-z0-9]{30,}` | `hf_abc123...` | | Replicate | `r8_[A-Za-z0-9]{37}` | `r8_xyz789...` | ### 云服务提供商 (12) | 提供商 | 模式 | 示例格式 | |----------|---------|----------------| | AWS Access Key | `AKIA[0-9A-Z]{16}` | `AKIAIOSFODNN7...` | | AWS Secret Key | `AWS_SECRET_ACCESS_KEY=...` | `wJalrXUtnFEMI/K7...` | | Azure OpenAI | `AZURE_OPENAI_KEY=...` 风格的 env 匹配 | `(context-based)` | | Google Cloud | `AIza...` / env 匹配 | `AIzaSyD...` | | Vercel | `vcp_`, `vci_`, `vca_`, `vcr_`, `vck_` | `vcp_abc123...` | | Supabase | `sbp_...` 和类似 JWT 的密钥 | `sbp_abc123def...` | | Cloudflare | 基于上下文的 token 匹配 | `(context-based)` | | Databricks | `dapi[a-f0-9]{32}` | `dapi123abc...` | | Snowflake | URL/密码上下文模式 | `(context-based)` | ### 开发工具 (10) | 提供商 | 模式 | 示例格式 | |----------|---------|----------------| | GitHub | `ghp_`, `gho_`, `ghu_`, `ghs_`, `ghr_` | `ghp_abc123...` | | GitLab | 仅限查询端 dork | `glpat-xyz...` | | Stripe | `sk_live_`, `sk_test_`, `rk_live_` | `sk_live_abc...` | | Figma | `figd_[A-Za-z0-9_-]{40}` | `figd_abc123...` | | LangSmith | `lsv2_[A-Za-z0-9]{40}` | `lsv2_abc123...` | | Airtable | `pat[A-Za-z0-9]{14}\.[a-f0-9]{64}` | `patABC.123def...` | | SendGrid | `SG\.[A-Za-z0-9_-]{22}\.[A-Za-z0-9_-]{43}` | `SG.abc.xyz...` | | Twilio | `SK[a-f0-9]{32}` / `AC[a-f0-9]{32}` | `SK123abc...` | ### 支付与分析 (8) | 提供商 | 模式 | 示例格式 | |----------|---------|----------------| | Stripe | `sk_live_[A-Za-z0-9]{24,}` | `sk_live_abc...` | | Sentry | `sntrys_[A-Za-z0-9_-]{64}` | `sntrys_abc...` | | PostHog | `phc_[A-Za-z0-9]{40,}` | `phc_abc...` | | Plaid | 通用的高熵/上下文模式 | `(context-based)` | ### 通讯平台 (5) | 提供商 | 模式 | 示例格式 | |----------|---------|----------------| | Slack | `xoxb-`, `xoxp-`, `xoxa-` 变体 | `xoxb-abc-123...` | | Discord | 在验证器中非一等公民,仅限查询/上下文 | `(context-based)` | | Telegram | 仅限查询/上下文 | `123456789:ABC...` | | Twilio | `SK...` / `AC...` | `SK123abc...` | | SendGrid | `SG...` | `SG.abc123...` |

False Positive Reduction

### 上下文感知过滤(40+ 模式) 排除常见的误报: * **测试/示例密钥**:`example`、`your_`、`xxx`、`placeholder`、`dummy`、`fake`、`sample`、`changeme`、`todo` * **文档字符串**:`public_key`、`public_token`、`api_version`、`secret_name`、`key_name`、`token_name` * **模式/代码词汇**:`primary_key`、`foreign_key`、`schema_key`、`sequence_key`、`key_code`、`key_alias` * **常见单词碰撞**:`keyboard`、`monkey`、`donkey`、`keystone`、`keystore` * **UUID/GUID 噪音**:除非模式明确与 Heroku 或 Pinecone 绑定,否则将被抑制 ### 熵分析 * **阈值**:大多数非 URL/非私钥匹配为 3.5 * **计算方式**:Shannon 熵 * **效果**:过滤掉看起来像凭证但实为垃圾信息的低随机性字符串 ### 最小长度检查 * **默认值**:大多数类似密钥的字符串至少包含 10 个以上字符 * **特定于提供商**:前缀和长度检查因提供商模式而异 * **效果**:在验证前剔除短 token 垃圾信息 ### 结果 * 与单纯基于正则表达式的匹配相比,**误报减少了约 70%** * 基于项目逻辑以及来自 GitHub Secret Scanning、Gitleaks、TruffleHog 和 GitGuardian 风格过滤思路的模式研究

Validation Endpoints

### 支持的提供商 (15+) | 提供商 | 端点 | 方法 | Header | |----------|----------|--------|--------| | OpenAI | `https://api.openai.com/v1/models` | GET | `Authorization: Bearer` | | Anthropic | `https://api.anthropic.com/v1/models` | GET | `x-api-key` | | Google AI | `https://generativelanguage.googleapis.com/v1beta/models` | GET | `x-goog-api-key` | | xAI (Grok) | `https://api.x.ai/v1/models` | GET | `Authorization: Bearer` | | Groq | `https://api.groq.com/openai/v1/models` | GET | `Authorization: Bearer` | | DeepSeek | `https://api.deepseek.com/v1/models` | GET | `Authorization: Bearer` | | Vercel | `https://api.vercel.com/v9/user` | GET | `Authorization: Bearer` | | Supabase | 仅限格式检查 | N/A | N/A | | GitHub | `https://api.github.com/user` | GET | `Authorization: token` | | Stripe | `https://api.stripe.com/v1/balance` | GET | `Authorization: Bearer` | | AWS | 仅限格式检查 | N/A | N/A | ### 自动检测 根据密钥格式自动识别提供商: * `sk-proj-` / `sk-` 前缀 → OpenAI 或 DeepSeek 候选项 * `sk-ant-` 前缀 → Anthropic * `gsk_` 前缀 → Groq * `xai-` 前缀 →AI * `ghp_` / `gho_` / `ghu_` 前缀 → GitHub * `AKIA` 前缀 → AWS 访问密钥格式 * `vcp_` / `vci_` / `vck_` 前缀 → Vercel * `sbp_` / JWT 风格前缀 → Supabase

References

### 模式研究 * **GitHub Secret Scanning**:[官方模式](https://docs.github.com/en/code-security/secret-scanning/secret-scanning-patterns) * **Gitleaks**:[开源 SAST 工具](https://github.com/gitleaks/gitleaks) * **TruffleHog**:[密钥扫描引擎](https://github.com/trufflesecurity/trufflehog) * **GitGuardian**:[机密泄露现状](https://www.gitguardian.com/state-of-secrets-sprawl-report-2025) ### API 文档 * **GitHub REST 认证**:[向 REST API 进行身份验证](https://docs.github.com/en/rest/authentication/authenticating-to-the-rest-api?apiVersion=2026-03-10) * **GitHub 代码搜索 API**:[用于搜索的 REST API 端点](https://docs.github.com/rest/search/search) * **GitHub Actions Token 文档**:[在 Workflow 中使用 GITHUB_TOKEN 进行身份验证](https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/controlling-permissions-for-github_token) * **OpenAI**:[API 概述](https://developers.openai.com/api/reference/overview) * **Anthropic**:[身份验证概述](https://platform.claude.com/docs/en/api/authentication/overview) * **Groq**:[快速入门](https://console.groq.com/docs/quickstart) * **Groq API**:[API 参考](https://console.groq.com/docs/api-reference) ### 安全研究 * **GitHub 搜索速率限制**:经过身份验证的代码搜索具有单独的速率限制,并且需要进行身份验证 * **Workflow 认证现实**:GitHub 在 Workflow 中支持 `GITHUB_TOKEN`,但当您想要明确控制搜索凭证时,使用专用 secret 仍然更安全 * **社区速率限制报告**:最近的讨论仍然显示在代码搜索和 token 范围方面存在令人困惑的 `403` 行为,因此本项目清晰地记录了专用的 `SCANNER_TOKEN` 路径 * **开发者影响**:密钥泄露绝大多数仍然源于正常的开发者工作流、备份、配置文件和意外提交 ### 误报研究 * **熵过滤**:更高的阈值可减少垃圾检测 * **上下文过滤**:特定于提供商的 env 名称和排除列表可减少嘈杂的命中 * **前缀验证**:稳定的供应商前缀仍然是最高置信度的信号 * **公开/私有分离**:当公开元数据和完整密钥分开写入时,操作安全性会得到提升

免责声明与致谢

仅供教育用途
本工具专为安全研究、审计和教育用途而设计。
在扫描您不拥有的仓库或验证您不拥有的凭证之前,请务必获得适当的授权。

开发者:
Matheus Sobral - 网络安全研究员

标签:API密钥扫描器, AWS, DPI, GitHub安全, OpenAI, Rust, 上下文感知, 信息泄露, 内存规避, 凭证泄露, 可视化界面, 威胁情报, 安全助手, 对抗攻击, 开发者工具, 开源安全工具, 敏感信息检测, 正则表达式匹配, 秘密发现, 网络安全, 网络流量审计, 逆向工程平台, 通知系统, 防御框架, 隐私保护, 高并发扫描