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