aharwelik/credsweep
GitHub: aharwelik/credsweep
一款零依赖的跨平台密钥与云凭证扫描器,通过逐字节等价的 Bash 和 PowerShell 双引擎,在代码提交前拦截敏感凭证泄露。
Stars: 0 | Forks: 0

# credsweep
**零依赖的密钥与云密钥扫描器 —— 一个工具,两种原生运行时。**
[](https://github.com/aharwelik/credsweep/actions/workflows/ci.yml)
[](LICENSE)
[]()
[]()
[]()
`credsweep` 会在凭证、云密钥和私钥泄露到提交、CI 日志或公开仓库之前将其找出。它以**两套逐字节等价的实现**发布 —— 一个是兼容 POSIX 的 `bash` 脚本,另一个是跨平台的 `PowerShell` 脚本 —— 因此,在开发者的 Mac、Linux CI runner 和 Windows 构建代理上都能运行*相同*的扫描,且**无需安装任何东西**。无需 Python,无需 Go 二进制文件,无需 `npm install`,也不进行任何网络调用。
大多数密钥扫描器都很笨重(Docker 镜像、语言运行时、云账户)。
`credsweep` 则只有两个文件,你可以直接把它们扔进任何仓库里,花五分钟就能从头到尾读完。
## 为什么会有这个项目
- **两种运行时,一套规则。** 安全团队使用 PowerShell;应用团队使用 bash。
`credsweep` 为双方提供了完全相同的 15 条规则检测引擎和完全相同的 JSON/SARIF 输出,因此无论谁运行扫描,扫描结果都是可比较的。
- **为 CI 而生。** 输出 **SARIF 2.1.0** 格式,因此结果会直接内嵌显示在 GitHub 的 *Security → Code scanning* 选项卡中,无需任何额外的配置。
- **天生的 pre-commit 属性。** 发现任何结果都会以非零状态码退出;内置了一个可直接符号链接的 git hook。
- **离线且可审计。** 无遥测,无需 API 密钥。可选的 AI 分类步骤完全是自主选择的。
## 检测规则(15 条)
| 提供商 / 类型 | 严重程度 | 提供商 / 类型 | 严重程度 |
|---|---|---|---|
| AWS Access Key ID (`AKIA…`) | HIGH | AWS Secret Access Key | CRITICAL |
| GCP API key (`AIza…`) | HIGH | Google OAuth secret (`GOCSPX-`) | HIGH |
| GitHub token (`ghp_/gho_/…`) | HIGH | GitHub fine-grained PAT | HIGH |
| Slack token (`xox…`) | HIGH | Slack webhook URL | MEDIUM |
| Stripe secret key (`sk_live_`) | CRITICAL | OpenAI key (`sk-…`) | HIGH |
| Anthropic key (`sk-ant-…`) | HIGH | npm token (`npm_…`) | HIGH |
| Azure Storage connection key | CRITICAL | Azure client secret | HIGH |
| PEM private key block | CRITICAL | JWT | MEDIUM |
此外还有一个**可选的熵值规则** (`--entropy` / `-Entropy`),只有当数值的香农熵值超过一定阈值时,该规则才会标记常规的 `password=`/`token=`/`secret=` 赋值操作 —— 这大大减少了导致大多数常规扫描器无法使用的误报。
## 安装
```
git clone https://github.com/aharwelik/credsweep.git
cd credsweep
chmod +x credsweep.sh
```
这就够了。你也可以选择将其符号链接到你的 `PATH` 中:
```
ln -s "$PWD/credsweep.sh" /usr/local/bin/credsweep
```
## 使用方法
**Bash**
```
./credsweep.sh . # scan current tree (human table)
./credsweep.sh src --format json # machine-readable JSON
./credsweep.sh . --format sarif > r.sarif
./credsweep.sh . --entropy # add high-entropy generic detection
./credsweep.sh . --no-fail # report but never break the build
./credsweep.sh . --exclude-dir fixtures --exclude-dir testdata
```
**PowerShell** (macOS / Linux / Windows)
```
./credsweep.ps1 . # scan current tree
./credsweep.ps1 src -Format json
./credsweep.ps1 . -Format sarif > r.sarif
./credsweep.ps1 . -Entropy
./credsweep.ps1 . -NoFail
```
### 在演示用例上尝试
该仓库包含一个生成器,它会写入一个充满(伪造)密钥的一次性项目 —— 不会将任何真实的密钥字面量提交到 git:
```
bash examples/generate-fixtures.sh # creates examples/leaky-project/ (gitignored)
./credsweep.sh examples # → 10 findings
```
### 输出示例
```
credsweep 1.0.0 — 10 finding(s) in examples
CRITICAL examples/leaky-project/config.example.env:3 aws-secret-access-key
aws_…****…EY
HIGH examples/leaky-project/config.example.env:2 aws-access-key-id
AKIA…****…LE
MEDIUM examples/leaky-project/config.example.env:9 slack-webhook
http…****…XX
```
匹配到的密钥**默认会被掩码处理** (`first4…****…last2`)。仅在你确实需要原始值时才使用 `--show-secrets`。
## CI 集成 (GitHub Actions)
`credsweep` 内置了一个工作流 (`.github/workflows/ci.yml`),它会对两个脚本进行 lint,并在每次推送时对生成的用例运行扫描器。如果你想在你的仓库中拦截密钥泄露并将其显示在 Security 选项卡中:
```
- name: Scan for secrets
run: ./credsweep.sh . --format sarif > credsweep.sarif
- uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: credsweep.sarif
```
## Pre-commit hook
```
ln -s ../../hooks/pre-commit .git/hooks/pre-commit
```
现在,任何试图引入密钥的 `git commit` 操作都会在本地被拦截。
## 可选的 AI 分类
对于需要书面风险摘要的团队,`credsweep` 可以将其 JSON 输出传递给 LLM 进行通俗易懂的分类(哪些密钥的风险最高,建议的轮换顺序)。这是一个**可选功能,且默认离线** —— 详情请参阅 [`docs/ai-triage.md`](docs/ai-triage.md)。核心扫描器永远不需要 API 密钥。
## 工作原理
- 单个规则表 (`name | severity | case-flag | regex`) 驱动着两套实现中的检测逻辑,因此添加一个提供商只需在每个文件中编辑一行。
- 二进制文件和高噪音目录 (`.git`, `node_modules`, `vendor`, `dist`, `target`, `.terraform`, …) 会被自动跳过。
- 熵值门槛使用了从零开始编写的香农熵计算(无需依赖库),因此通用规则只会在真正的密钥上触发,而不会在 URL 这种长但低熵的字符串上触发。
## 局限性(诚恳的说明)
- 正则表达式 + 熵值检测的信号强度很高,但并不详尽 —— 应该将一次干净的扫描视为“未发现*已知模式*”,而不是安全的绝对证明。
- 提供商的前缀会存在重叠(例如 `sk-ant-…` 也会匹配更宽泛的 `sk-…` OpenAI 规则),因此一个 Anthropic 密钥可能会被两条规则同时报告。两者说的都是同一件事:请轮换它。
- 熵值阈值(3.5 比特/字符)是为常规密钥调优的;如果需要更严格的扫描,可以适当调低该数值。
## 作者
**Anthony Harwelik** — 创始人,**Sole Priority LLC** / **BlueTech Green**。
专注于安全与 AI 工具、自动化以及云工程。
- Email: **aharwelik@gmail.com**
- Web: **https://bluetechgreen.com**
- GitHub: **[@aharwelik](https://github.com/aharwelik)**
欢迎就安全自动化和 AI 辅助的 DevSecOps 进行咨询与合作。
## 许可证
[MIT](LICENSE) © Anthony Harwelik标签:AI合规, Bash, IPv6, PowerShell, SARIF, StruQ, 应用安全, 开发安全, 敏感信息扫描