santhsecurity/keyhog

GitHub: santhsecurity/keyhog

一款轻量、高性能的Rust秘密扫描器,可快速发现代码、Git历史、容器和云存储中的敏感凭证。

Stars: 73 | Forks: 9

keyhog - secret scanner - 894 detectors - gpu

latest release  MIT OR Apache-2.0  CI  GitHub stars

属于 Santh  ·  博客  ·  @SanthProject

**keyhog** 扫描源代码树、Git 历史、Docker 镜像、S3 存储桶以及运行中的系统,以查找泄露的凭证。**894 个服务特定检测器**、解码穿透(base64/hex/url/protobuf)、置信度评分、SARIF 输出、零运行时配置。默认的 `keyhog scan .` 开箱即用。 ### 将其添加到你的 CI(一个工作流文件) ``` # .github/workflows/keyhog.yml name: keyhog on: [push, pull_request] permissions: { contents: read, security-events: write } jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: santhsecurity/keyhog/.github/actions/keyhog@v0.5.37 with: { path: ., severity: high, format: sarif } ``` 对你的 CI 的成本:约 20 MB 二进制下载(可缓存)、托管运行器上约 400 ms 冷启动(GPU 自动禁用、SIMD 路径)、5,000 文件仓库约 10 s 挂钟时间。单一 `libhyperscan5` apt 包,无需 Python、无需 JVM、无需 Docker 守护进程。扫描结果以 SARIF 格式自动上传到 GitHub 代码扫描;通过提交基线(`keyhog scan --create-baseline .keyhog-baseline.json`)可在不破坏现有树的情况下采用,这样操作仅在发现新秘密时失败。 对于超精简 CI 安装,现在可以使用 `cargo install keyhog --no-default-features --features ci`:13 MB 二进制(相比于完整版的 22 MB)、约 140 ms 冷启动、无 Hyperscan 依赖、无 wgpu/Vulkan 探测、无 libstdc++ 链接。同样 894 个检测器,同样 ML/熵/解码/多行数据路径。在自构建的 CI 镜像此配置,适用于二进制大小或容器冷启动重要的场景;上述预构建安装程序仍然是开箱即用的单二进制下载默认选择。 GitLab CI、CircleCI、Drone、BuildKite、Jenkins、Bazel、pre-commit、Husky、lefthook 配置: [`docs/DROP_IN_USAGE.md`](docs/DROP_IN_USAGE.md)。 ### 工作原理 keyhog 将其 894 个检测器编译为单个 Hyperscan NFA 数据库,在匹配前先解码嵌套编码,通过贝叶斯 Beta(α,β) 反馈为每个检测器校准置信度,并将每次扫描路由到当前最快的硬件后端: | 层 / 后端 | 何时 | 如何 | |---|---|---| | `simdsieve` 预过滤器 | AVX-512 / AVX2 / NEON | 第 1 层:在正则表达式后端运行之前,以最高 **50 GB/s** 的速度扫描每个文件,寻找 8 个最高价值秘密前缀(AWS `AKIA`/`ASIA`、GitHub `ghp_`、OpenAI `sk-proj-`、Slack `xoxb-`/`xoxp-`、SendGrid `SG.`、Square `sq0csp-`) | | `gpu-zero-copy` | 独立 GPU + 扫描大小 ≥256 MiB | 通过 WGPU(跨平台)或可选的 CUDA 后端在 GPU 上运行 vyre AC 自动机 | | `simd-regex` | AVX-512 / AVX2 / NEON + Hyperscan | 并行多模式 NFA,约 500 MB/s | | `cpu-fallback` | 无 SIMD、无 GPU | Aho-Corasick 前缀 + Rust `regex` 提取 | `simdsieve` 预过滤器是一个性能层,而非独立的检测器:命中结果会在其**规范检测器 ID**(`aws-access-key`、`github-classic-pat`、`slack-bot-token`……)下呈现——在所有平台和构建上相同,无论是由快速路径还是完整正则引擎发现的。 后端选择是自动的。启动时: ``` keyhog v0.5.37 | 16 cores | SIMD: AVX-512 | Hyperscan | 894 detectors ``` **完整文档:** [santhsecurity.github.io/keyhog](https://santhsecurity.github.io/keyhog/) – 安装、首次扫描、输出格式、检测内部机制、抑制、验证、pre-commit + CI 集成、CLI 参考、退出码、环境变量、贡献。源码位于 `docs/`。 ## 安装 ``` # Linux / macOS curl -fsSL https://raw.githubusercontent.com/santhsecurity/keyhog/main/install.sh | sh # Windows (PowerShell) iwr https://raw.githubusercontent.com/santhsecurity/keyhog/main/install.ps1 -useb | iex # 从源代码 (任意平台) git clone https://github.com/santhsecurity/keyhog.git cd keyhog && cargo build --release -p keyhog # 从 crates.io cargo install keyhog --no-default-features --features portable ``` 适用于 **Linux**、**macOS**(Intel + Apple Silicon)、**Windows**。零配置。`keyhog scan .` 开箱即用。 安装程序会自动检测主机状态并选择合适的默认值: **所有地方都使用 WGPU + SIMD**,包括 Linux NVIDIA 主机——WGPU 通过 vulkan 后端在 GPU 上运行相同的 vyre AC / RulePipeline 调度,二进制更小且无 `libcuda.so` 运行时依赖。专用的 `keyhog-linux-x86_64-cuda` 变体仅在完整的 CUDA 工具包存在时(nvcc 在 PATH 上、`$CUDA_HOME` 已设置或 `/usr/local/cuda` 存在)才会自动选择——这表明您正在积极使用 CUDA 开发环境,而不仅仅是安装了 NVIDIA 驱动。Apple Silicon 主机将收到明确的“Metal GPU 加速即将推出”提示。每次下载都会在安装前根据发布端的校验和文件进行 SHA256 验证。 使用 `KEYHOG_VARIANT=cuda`(强制原生 CUDA 构建,运行时需要 `libcuda.so`)或 `KEYHOG_VARIANT=cpu`(强制默认的 WGPU + SIMD 构建,跳过 GPU 检测)覆盖变体。使用 `KEYHOG_VERSION=v0.5.37` 固定版本。使用 `KEYHOG_INSTALL=/usr/local/bin` 更改安装目录。 同一脚本包含三种诊断模式: ``` sh install.sh --diagnose # print host + binary state, change nothing sh install.sh --repair # re-download the right variant for this host sh install.sh --uninstall # remove the binary (leaves PATH entries alone) ``` 对于交互式安装(变体提示 + 安装后向导,用于 PATH、shell 补全、Claude Code / Cursor 钩子、git pre-commit 钩子),请先下载脚本而不是直接通过 sh 管道执行: ``` curl -fsSL https://raw.githubusercontent.com/santhsecurity/keyhog/main/install.sh \ -o keyhog-install.sh sh keyhog-install.sh ``` 守护进程模式(亚 100 ms 的 pre-commit 扫描)仅适用于 Unix。其他所有功能在 Windows 上相同。 ## 保持 keyhog 健康并更新 安装后,keyhog 会自我维护——安装脚本仅用于首次安装: ``` keyhog doctor # health check: host probe + end-to-end scan self-test keyhog backend --self-test --json # CI-readable GPU path health proof keyhog update # self-update to the latest release (verified download + atomic swap) keyhog update --check # is a newer release available? (exits 10 if yes, 0 if current) keyhog update --variant cuda # update to the CUDA build instead of the portable one keyhog repair # reinstall a known-good binary if the self-test fails (--force to force) keyhog uninstall # remove the binary (dry run; pass --yes to actually delete) ``` `keyhog doctor` 重用扫描器自身的硬件探测并运行真正的端到端自检——它会植入一个合成秘密并确认二进制能够检测到它——因此这是权威的“keyhog 能否在此工作?”检查(安装程序会在安装后自动运行它)。`update` 和 `repair` 通过 HTTPS 下载发布二进制,使用 keyhog 的内嵌公钥验证其 minisign 签名,并以原子方式替换运行中的二进制;拒绝被篡改或签名不匹配的二进制。在健康的主机上,`keyhog update` 是一键升级路径。 `keyhog backend --self-test --json` 是供自托管运行器使用的机器可读 GPU 健康检查。当生产 GPU 扫描路径在运行时降级时,它以退出码 `4` 退出,并输出稳定的 `ok`、`status`、`exit_code`、`recommended_backend` 及每个探测的字段,用于 CI 路由。 ## 快速入门 ``` keyhog scan . # scan a directory keyhog scan --git-staged # pre-commit: only staged blobs keyhog scan --git-diff main # files changed since base ref keyhog scan --git-history . # every commit, every branch keyhog scan --docker-image registry/app:v1 # Docker image layers keyhog scan --s3-bucket logs-prod --s3-prefix / # S3 objects (--s3-endpoint for non-AWS) keyhog scan --github-org acme --github-token "$GH_PAT" # every repo in a GitHub org (PAT required) keyhog scan-system --space 50G # walk every drive, every git history ``` 交互式仪表板: ``` keyhog tui demo # live finding feed + GPU panel + stats keyhog tui . --throttle-ms 200 # paced scan, useful for recordings/demos ``` 过滤、格式化、门控: ``` keyhog scan . --severity high # info | low | medium | high | critical keyhog scan . --min-confidence 0.5 # raise the ML floor keyhog scan . --format sarif -o keyhog.sarif # GitHub code scanning keyhog scan . --verify # live-verify against vendor APIs keyhog scan . --baseline .keyhog-baseline.json # only NEW findings vs snapshot keyhog scan . --fast # pre-commit speed (skip ML + decode) keyhog scan . --deep # max detection depth keyhog scan . --incremental # BLAKE3 Merkle skip → 10–100× CI loop ``` 退出码:`0` 干净、`1` 发现结果高于严重性阈值、`2` 用户错误(错误路径、错误配置、不支持的标志)、`3` 系统错误或检测器语料审计失败、`4` `backend --self-test` 失败、`10` 发现实时凭证(需要 `--verify`)、`11` 扫描线程在扫描过程中崩溃(状态不可靠,信任前请重新运行)。与 `keyhog --help` 一致。 ## 它能捕获什么 894 个服务特定检测器,带有校验和 / 配套验证: - **云提供商**:AWS(访问密钥 + 密钥 + STS 验证)、Azure(订阅密钥、存储账户密钥、SAS)、GCP(服务账户、API 密钥)、Cloudflare、Heroku、Vercel、Supabase。 - **支付处理器**:Stripe、Braintree、Razorpay、Paddle、Plaid、Square、PayPal——所有都要求配套验证(没有对应的公钥时,Braintree 私钥永远不会触发)。 - **源码托管平台**:GitHub PAT(带 CRC32 校验和)、GitLab 令牌、Bitbucket 应用密码、npm 令牌(带校验和)、Gitea / Forgejo / Codeberg。 - **身份验证 / SSO**:Okta、Auth0、Clerk、JumpCloud、Kinde。 - **通讯**:Slack、Discord、Twilio、SendGrid、Postmark、Mailgun、Resend、Loops。 - **AI / ML**:OpenAI(sk-/sk-proj-)、Anthropic、Google AI Studio、Cohere、Mistral、HuggingFace、Replicate。 - **数据库**:Postgres 连接字符串、MongoDB Atlas、Supabase service-role、PlanetScale、Neon、Turso、MySQL、Redis URL。 - **通用 + 熵回退**:`API_KEY=<高熵数据块>` 捕获没有命名检测器的凭证,通过上下文熵阈值 + ML 评门控。 - **加密材料**:RSA / EC / SSH 私钥、PGP 私钥块、JWT 签名秘密。 每个检测器作为一个 [TOML 文件](./detectors/)(数据,而不是代码)提供:服务元数据、正则模式、关键词、配套字段、验证处理器。添加一个新检测器只需要 5–10 行 TOML;[贡献者指南](./CONTRIBUTING.md) 会引导您完成。 浏览完整目录:[`/site/detectors.html`](./site/detectors.html)——加载所有 894 个检测器,支持严重性 + 服务 + 关键词过滤。 ## 为什么召回率更高、误报更少 - **解码穿透扫描**:Kubernetes `Secret` 清单、JWT 负载、base64 包装的环境变量、Helm values、docker-config `auth:` 数据块——结构化预处理器会就地解码它们,并将明文馈送给每个下游检测器,因此检测器无需各自重新实现解码。 - **多行重组**:JavaScript 中的 `"sk-proj-" + \` 续行、YAML 多行字符串、Makefile 反斜杠续行、Helm / Jinja 模板化输出——全部在正则匹配前重新组装。 - **配套验证**:没有 40 字符密钥的 AWS 访问密钥?跳过。没有身份验证令牌的 Twilio API 密钥?跳过。对于高噪声检测器,需要双信号确认,从而削减了经典的 `git log -G ghp_` 误报集群。 - **置信度评分**:每个发现结果都带有一个 `[0.0, 1.0]` 的分数,由香农熵、周围上下文、配套匹配、校验和(GitHub CRC32、npm、Slack)和一个小型 ML 分类器(约 30k 参数)共同决定。默认阈值 `0.3` 过滤掉低质量匹配,而不会隐藏真正的秘密。 - **贝叶斯每个检测器校准**:`keyhog calibrate --fp generic-api-key` 提供 Beta(α,β) 后验,会抑制在您的代码库中错误触发的检测器,随着时间推移自动优化,无需手动调整规则。 ## 性能 与 BetterLeaks、Kingfisher、TruffleHog 和 Titus 进行直接比较,由 [`benchmarks/`](benchmarks/) 中的可重现测试框架进行相同评分:遵循 SecretBench 包含规则,**从每个扫描器的扫描树中排除**真实答案清单,因此没有工具会看到答案键。下表由 `make -C benchmarks report` 生成——**请勿手动编辑。** ### 检测排行榜 语料库:**mirror**——15000 个测试样本,3000 个标记为正例。每个扫描器的评分相同(SecretBench 重叠规则);答案键清单已从扫描树中排除。 | 排名 | 扫描器 | F1值 | 精确率 | 召回率 | 发现数 | 耗时 | 峰值内存 | |---|---|---|---|---|---|---|---| | 1 | **KeyHog** | **0.9108** | 0.9868 | 0.8457 | 2583 | 1.94s | 1077 MB | | 2 | TruffleHog | 0.5265 | 1.0000 | 0.3573 | 1072 | 1.73s | 308 MB | | 3 | Kingfisher | 0.4720 | 0.3912 | 0.5947 | 5241 | 4.88s | 421 MB | | 4 | Titus | 0.4127 | 0.3318 | 0.5457 | 5159 | 2.53s | 117 MB | | 5 | Nosey Parker | 0.4078 | 0.3414 | 0.5063 | 4532 | 0.75s | 285 MB | | 6 | BetterLeaks | 0.3585 | 0.2313 | 0.7967 | 10828 | 0.77s | 192 MB | ### 速度与内存 | 扫描器 | 配置 | 语料库 | 耗时 | 吞吐量 | 峰值内存 | |---|---|---|---|---|---| | Nosey Parker | `default-nocache-nodaemon-no-git-history` | mirror | 0.75s | 3.1 MB/s | 285 MB | | BetterLeaks | `default-nocache-nodaemon-no-validate` | mirror | 0.77s | 3.0 MB/s | 192 MB | | TruffleHog | `default-nocache-nodaemon-no-verify` | mirror | 1.73s | 1.3 MB/s | 308 MB | | KeyHog | `simd-nocache-nodaemon-full` | mirror | 1.94s | 1.2 MB/s | 1077 MB | | Titus | `default-nocache-nodaemon-no-validate` | mirror | 2.53s | 0.9 MB/s | 117 MB | | BetterLeaks | `default-nocache-nodaemon-no-validate` | creddata | 3.07s | 316.5 MB/s | 261 MB | | KeyHog | `simd-nocache-nodaemon-full` | creddata | 3.95s | 246.1 MB/s | 2035 MB | | Kingfisher | `default-nocache-nodaemon-low-no-validate` | mirror | 4.88s | 0.5 MB/s | 421 MB | | Kingfisher | `default-nocache-nodaemon-low-no-validate` | creddata | 8.13s | 119.4 MB/s | 657 MB | ### 按类别差距(竞争者仍占优的领域) | 类别 | KeyHog F1值 | 最佳竞争者 | 差距 | 竞争者总体精确率 | |---|---|---|---|---| | `generic-high-entropy-string` | 0.446 | BetterLeaks 0.893 | +0.447 | 0.231 | 重现:`make -C benchmarks bench` 会在 15k SecretBench-mirror 语料库上运行每个扫描器,并将结果写入 `benchmarks/results//`;`make -C benchmarks report` 会重新生成上述表格和 `benchmarks/reports/`。参见 [`benchmarks/README.md`](benchmarks/README.md) 了解语料库(mirror、竞争者主场地、Samsung/CredData)和后端/缓存/守护进程/操作系统/GPU 矩阵。 ## CI 集成 ### GitHub Actions ``` - uses: santhsecurity/keyhog/.github/actions/keyhog@v0.5.37 with: path: . severity: high # info | low | medium | high | critical format: sarif # SARIF auto-uploads to GitHub code scanning baseline: .keyhog-baseline.json # block only NEW findings ``` 自动下载预构建二进制;当没有发布资产与主机三元组匹配时,回退到 `cargo build`。SARIF 在每个发现结果上携带 CWE-798 和 OWASP A07:2021 分类。 ### CI 永远不需要 GPU **keyhog 在 CI 中纯粹使用 CPU/SIMD——无需 GPU、无需驱动、无需 CUDA 工具包。** keyhog 会自动检测托管的 CI 运行器(`CI=true` 以及十几个特定于提供商的标记),并跳过所有 GPU 初始化路径,将所有工作路由到 SIMD/CPU 引擎。无需任何配置:GPU 仅用于拥有 GPU 的机器上的交互式桌面扫描,从来必需项。CPU 和 GPU 上的检测结果是相同的——GPU 只改变吞吐量,从不改变发现的秘密。 想要使用自托管运行器上的真实 GPU?设置 `KEYHOG_NO_GPU=0` 以重新启用。 在 CI 中从源代码构建 keyhog(而不是使用预构建二进制)?使用 `portable` 特性——所有检测功能,无系统库构建依赖(跳过 Hyperscan/Ghidra 构建步骤): ``` - run: cargo install keyhog --no-default-features --features portable - run: keyhog scan . --format sarif --severity high > keyhog.sarif ``` 其他 CI(GitLab、CircleCI、Drone、BuildKite、Jenkins),pre-commit 配置、Husky / lefthook,以及完整的 SARIF 模式:[`site/ci.html`](./site/ci.html) 和 [`docs/DROP_IN_USAGE.md`](docs/DROP_IN_USAGE.md)。 ### Pre-commit 钩子 ``` keyhog hook install # writes .git/hooks/pre-commit keyhog hook uninstall # removes the keyhog-generated hook ``` 安装的钩子会在每次提交时调用 `keyhog scan --fast --git-staged`。如果 `keyhog daemon start` 正在运行,进程内扫描会复用守护进程编译好的扫描器,延迟低于 50 ms;否则钩子会在每次提交时承担约 3 秒的编译成本。 或者通过 `pre-commit` 框架: ``` repos: - repo: https://github.com/santhsecurity/keyhog rev: v0.5.37 hooks: - id: keyhog ``` ## 守护进程模式(重新扫描快 105 倍) 默认桌面构建中,每次 keyhog 调用都需要约 2 秒的冷启动(Hyperscan 编译 + GPU 适配器探测)。上述精简 ci 配置通过跳过两者将其降至约 140 ms。对于 pre-commit 和 IDE 保存处理器,即使 140 ms 也太多,可将 keyhog 作为守护进程运行:成本在每台主机上只支付一次,后续每次扫描只需 **~7 ms**: ``` keyhog daemon start # Unix socket on $XDG_RUNTIME_DIR keyhog scan --stdin --daemon < .env # 7 ms instead of 740 ms keyhog daemon status keyhog daemon stop ``` 在 pre-commit 钩子、IDE 保存处理器或任何每个提交的 CI 循环中使用。systemd / launchd 单元示例见 [`site/daemon.html`](./site/daemon.html)。 IDE 的监视模式: ``` keyhog watch ./src # inotify/FSEvents/RDCW; sub-100 ms per save ``` ## 系统级凭证分类 ``` sudo keyhog scan-system --space 50G # default 50 GiB ceiling sudo keyhog scan-system --space 1T --include-network # also scan NFS / SMB sudo keyhog scan-system --space 10G --no-git-history # skip historical blobs ``` 枚举所有已挂载的驱动器(跳过伪文件系统如 `/proc`、`/sys`、`tmpfs`、`nsfs`、`fuse.snapfuse`),自动发现每个 `.git`(工作树 + 裸仓库 + 子模块),并运行完整扫描 + Git 历史流水线。遵守硬性 `--space ` 上限,发现结果时退出码为 1。专为事件响应分类、并购继承审计和季度开发者笔记本电脑扫描而构建。 ## 锁定模式(安全关键性嵌入) 对于 keyhog **与所持秘密在同一台机器上** 运行的部署(例如与 [EnvSeal](https://github.com/santhsecurity/envseal) 配合使用),且扫描器与其检查的凭证之间没有可信边界: ``` keyhog scan . --lockdown ``` 强制实施: - Linux 上的 `mlockall(MCL_CURRENT|MCL_FUTURE)`——凭证永远不会交换到磁盘。 - `PR_SET_DUMPABLE = 0`(始终启用,即使在锁定模式外)——禁用核心转储、ptrace、`/proc//mem` 读取。macOS 上使用 `PT_DENY_ATTACH`。 - Linux 上的 `setrlimit(RLIMIT_CORE, 0)`——内核拒绝写入任何核心文件,无论系统的 `coredump_filter` 如何设置,因此匿名页面永远无法通过转储路径到达磁盘。 - 如果 `~/.cache/keyhog/*` 存在则拒绝运行,拒绝 `--incremental` 写入,拒绝 `--verify`,拒绝 `--show-secrets`,拒绝 `--fast` / `--no-decode` / `--no-entropy` / `--no-ml` / `--no-unicode-norm` / `--no-default-excludes`(每个选项都以速度换取检测完整性;锁定模式用于最高风险的运行,您希望启用每道门)。 始终开启的加固措施(除 mlock + 缓存拒绝外的一切)适用于每次 keyhog 调用——即使没有 `--lockdown`,keyhog 二进制也无法被核心转储或 ptrace。 ## 库 API ``` use keyhog_core::{Chunk, ChunkMetadata, DetectorFile}; use keyhog_scanner::CompiledScanner; // build.rs embeds every detectors/*.toml as a (name, toml-body) pair. let detectors: Vec<_> = keyhog_core::embedded_detector_tomls() .iter() .filter_map(|(_name, body)| toml::from_str::(body).ok()) .map(|file| file.detector) .collect(); let scanner = CompiledScanner::compile(detectors)?; let findings = scanner.scan(&Chunk { data: "TOKEN=sk_live_EXAMPLE…".into(), metadata: ChunkMetadata::default(), }); ``` 通过编译前拼接来混合内置和自定义检测器。扫描器是 `Send + Sync`;可在 rayon 工作线程间共享一个。`keyhog-sources` 中提供了流式源辅助工具(文件系统、git、stdin、Docker、S3、GitHub 组织)。`keyhog-verifier` 中提供了实时验证。 完整 API 表面 + 稳定性策略:[`site/api.html`](./site/api.html)。 ## 配置 通过 `.keyhog.toml` 设置每个仓库的默认值: ``` [scan] severity = "high" min_confidence = 0.40 # canonical default; raise toward 0.85 for fewer FPs exclude = ["**/test/fixtures/**", "vendor/"] [detector.generic-api-key] enabled = false # noisy detector? turn it off (hot-* fast-path # ids like `hot-aws_key` are disabled the same way) [detector.twilio-api-key] min_confidence = 0.6 # per-detector floor; overrides the global one [lockdown] require = true # refuse to run unless --lockdown is passed ``` 优先级(右侧优先):编译默认值 → `.keyhog.toml`(从扫描路径向上查找) → CLI 标志。规范默认值位于 `ScanConfig::default()`(`crates/core/src/config.rs`)。完整参考:[`docs/src/reference/configuration.md`](./docs/src/reference/configuration.md)。 使用 `.keyhogignore` 文件按哈希、路径通配符或检测器 ID 抑制特定发现(而非整个检测器)——参见[抑制规则](./docs/src/suppressions.md)。 通过哈希、路径通配符或检测器 ID 将已知泄露加入白名单——附带可选的 `reason` / `expires` / `approved_by` 治理元数据: ``` # .keyhogignore gitignore 风格的简写 *.log node_modules/ 9d6060e21ef8d5daec9cfe4a44b1b1bc9792246bfad28210edaaa1782a8a676a # 显式形式与治理 hash:9f86d081… ; reason="rotated 2026-04-25" ; expires=2026-07-01 ; approved_by="security@acme" detector:demo-token path:**/fixtures/*.env ``` 超过 `expires` 的条目会在加载时静默丢弃并发出 WARN 日志。 ## 架构 ``` crates/ core/ Detector loading, finding types, reporting (text/JSON/SARIF), allowlists scanner/ Hardware routing, Hyperscan, GPU, decode-through, entropy, ML, multiline sources/ File system, git (staged/diff/history), stdin, Docker, S3, GitHub org, web verifier/ Live credential verification (341 detectors carry an active `[detector.verify]` endpoint) cli/ CLI binary, daemon, watch, baselines, calibrate, hook installer detectors/ 894 TOML files (data, not code) site/ Documentation site (17 pages, GitHub-Pages-ready) benchmarks/ Reproducible eval harness: corpora, scanner adapters, scorer, README report generator tools/ Legacy SecretBench scripts (superseded by benchmarks/; score.py kept as the scorer regression anchor) ``` 两阶段合并扫描: 1. **阶段 1**——在原始字节上运行 Hyperscan NFA,通过 rayon 并行处理所有文件。95% 以上的文件没有命中,零成本。 2. **阶段 2**——仅对命中的进行完整提取:正则捕获组、配套匹配、校验和验证、熵门控、ML 置信度 + 贝叶斯阻尼。 结果:一个多 GB 的单体仓库在数秒内扫描完成。确定性是合约的一部分——相同输入 → 相同输出,字节精确,每次如此。 完整架构文章、硬件路由矩阵、性能分析技巧:[`site/architecture.html`](./site/architecture.html) 和 [`site/performance.html`](./site/performance.html)。 ## 其他有用的子命令 ``` keyhog detectors --search aws --verbose # list / inspect detectors keyhog explain aws-access-key # spec, regex, severity, rotation guide keyhog diff before.json after.json # NEW / RESOLVED / UNCHANGED for CI gates keyhog calibrate --tp aws-access-key # record a true positive keyhog calibrate --fp generic-api-key # record a false positive keyhog calibrate --show # posterior-mean bar chart per detector keyhog backend # detected hardware + routing matrix keyhog completion zsh # shell completions (bash/zsh/fish/powershell/elvish) ``` ## 贡献 - **新检测器?** 将一个 TOML 文件放入 [`detectors/`](./detectors/),打开一个 PR。贡献者指南([`CONTRIBUTING.md`](./CONTRIBUTING.md))包含模式和一个完整示例。 - **Bug / 遗漏的秘密 / 误报?** 提交一个 issue,附上脱敏的凭证形状和检测器 ID;每个报告都会成为 [`tests/contracts/`](./crates/scanner/tests/contracts/) 下的永久测试样例。 - **keyhog 本身的安全问题?** 不要公开提交 issue——发送邮件至 `security@santh.dev`(PGP 密钥在组织页面上)。 [变更日志](./CHANGELOG.md)。[未解决的问题](https://github.com/santhsecurity/keyhog/issues)。 ## 致谢 keyhog 建立在先前的秘密扫描工作之上。借鉴了以下项目的思路: - [trufflehog](https://github.com/trufflesecurity/trufflehog)——检测器广度 + 验证语义 - **betterleaks**——熵/关键词融合和误报抑制 - **titus**——扫描人体工程学和严重性校准 这些项目及其贡献者。 ## 许可证 MIT。可商业使用、嵌入、分支、销售托管版本。检测器 TOML 也是 MIT——添加一个检测器只需 5 行 PR,零法律摩擦。 ## Star 历史 如果 keyhog 曾帮助您避免泄露凭证,一个 star 是告诉下一个人它存在的最便宜方式。 Star history of santhsecurity/keyhog
标签:base64解码, DevSecOps, Docker镜像扫描, Git扫描, Hyperscan, protobuf解码, Rust, S3扫描, SARIF, URL解码, 上游代理, 云安全监控, 凭据泄漏, 十六进制解码, 可视化界面, 开源, 源代码审计, 秘密扫描, 网络流量审计, 置信度评分, 通知系统, 零配置, 静态分析