绝对不是!
在这个 LLM 炒作的时代,DeepSecrets 依然完全在你的机器上运行——离线、安全且免费地为你提供出色的结果。
大多数现有扫描器实际上并不“理解”代码。它们只是解析文本,覆盖率很差。
DeepSecrets 弥合了经典正则扫描器与全规模商业 SAST 工具之间的差距。它通过大量依赖语义代码分析、危险变量检测和上下文感知熵分析,扩展了经典的正则扫描策略。 这意味着密钥候选始终在语义上是正确的。我们利用词法分析和解析技术,实现了对 500 多种语言和格式的真正代码理解。
DeepSecrets 还引入了一种零知识发现凭据的新方法:HashedSecret 引擎。只需提供你已知生产密钥的哈希值,该工具就会在你的代码中找到以明文形式暴露的这些密钥。
DeepSecrets v2.0 于 2026 年 6 月针对 SecretBench 基准进行了评估,表现优于传统的纯文本扫描器:
(你可以在我的 HackerNoon 文章此处中阅读完整的内部故事和基准测试明细)
通过 pip 从 Github 安装
$ pip install git+https://github.com/ntoskernel/deepsecrets.git
来自 PyPi
$ pip install deepsecrets
DeepSecrets 需要 Python 3.11 或更高版本。
运行扫描最简单的方式:
$ deepsecrets --target-dir /path/to/your/code --outformat dojo-sarif --outfile report.json
这将对 /path/to/your/code 运行一次扫描,使用默认配置:
SARIF 格式的报告(兼容 DefectDojo 和 GitHub Security)将保存到 report.json。
--help 命令随时可以为你提供指导,但以下是你可用来根据环境定制扫描的关键标志:
--regex-rules /path/to/rules.json:提供你自己的自定义正则规则集。--hashed-values /path/to/hashes.json:提供一份预先哈希的已知生产密钥列表,以便安全地搜索它们。--excluded-paths /path/to/exclusions.json:覆盖或扩展扫描期间忽略的默认路径。--deep-max-size BYTES:大于此值(默认 250,000 字节)的文件会进行快速分析:正则规则和变量搜索,不使用语言词法分析器。大文件大多是生成或压缩的,词法分析器在这类文件上耗费了大部分扫描时间,而且很少能发现更多内容。0 表示对每个文件都进行完整分析。--skip-bundles:在其他路径排除项之外,完全跳过压缩的 JavaScript、source map 和 bundle(*.min.js、*.map、*.bundle.js)。--confidence-level {all,low,medium,high,very-high}:要报告的最低置信度(默认 low,即所有发现)。medium、high 和 very-high 分别保留置信度 3、6 和 9 及以上;all 还会报告扫描器判定并非密钥的正则匹配(占位符、示例),并带有 -INFO 规则 ID。--report-diagnostics:将目标下找到的每个文件添加到 SARIF 报告中,包括其状态、扫描时间、跳过原因和分析深度。--regex-candidate-scoring-rules /path/to/rules.json:提供你自己的规则,用于在报告正则匹配之前对其进行判定。不给该标志赋值则报告未经判定的正则匹配。--multiprocessing-context {forkserver,spawn,fork}:工作进程的启动方式。在平台支持的情况下(Linux、macOS),默认值为 forkserver:工作进程共享已在服务器进程中加载的扫描器。Windows 使用 spawn。这三种方式产生相同的发现结果。--disable-masking:在输出报告中保持潜在密钥不掩码 (见下方注意事项)。--ci / --no-ci:开启或关闭 CI 模式。CI 模式每 30 秒打印一行纯文本进度,而不是实时进度显示。它在 CI 服务(GitHub Actions、GitLab CI、Jenkins 等)内部以及输出不是终端时会自动开启。例如 .github/workflows/deepsecrets.yml
name: DeepSecrets Scan
on: [push, pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install DeepSecrets
run: pip install deepsecrets
- name: Run Scan
run: deepsecrets --target-dir . --outformat dojo-sarif --outfile report.sarif
continue-on-error: true
- name: Upload SARIF report
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: report.sarif
自 v1.3.0 起,报告中的潜在机密会被自动掩蔽,以保护你的流水线产物。如有必要,可通过 --disable-masking 标志关闭此功能。
掩蔽不会破坏下游平台(如 Github)的去重逻辑,因为报告中的 partialFingerprints 部分是基于原始数据正确填充的。
[!Caution]
如果你在禁用掩蔽的情况下将 DeepSecrets 集成到 CI 流水线中,你很可能会在 CI 日志和产物中再次泄露你的机密。
每个发现都会获得一个置信度分数。然而,不同的安全平台对 SARIF 指标的解析方式各不相同。为确保与现代 ASPM 仪表板的兼容性,DeepSecrets 采取以下措施:
虚拟子规则(rules[]):按置信度层级动态生成规则,从 S105-LOW 到 -MEDIUM、-HIGH,再到 S105-VERY-HIGH(对于 --confidence-level all 报告的被拒绝匹配则为 -INFO)。这会促使 GitHub Security 和 DefectDojo 正确映射语义精确度的差异,同时不破坏原生解析器。
确定性的结果级别:该工具始终在 results[] 模型中显式设置 level: error。这为 CI/CD 流水线和较旧的 SAST 解析器提供了通用回退机制,确保无论各规则如何解读,暴露的机密都能可靠地使构建失败或阻止 Pull Request。
上下文消息:将原始数值置信度分数原生注入到 result.message.text 中,以便安全分析师能在其仪表板上立即看到。
用于正则检查的内置规则集位于 /deepsecrets/rules/regexes.json。你可以按照该格式自由创建自定义规则集。
用于哈希检查的示例规则集位于 /tests/fixtures/hashed_secrets.json。你可以按照该格式自由创建自定义规则集。
要在不在仓库中以明文暴露的情况下查找已知的生产机密,请提供一个包含其哈希值的 JSON:
[
{
"name": "KNOWN-PROD-DATABASE-PASSWORD",
"hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"length": 12,
"algorithm": "sha1"
}
]
使用 --hashed-values /path/to/hashes.json 运行。DeepSecrets 会在词法分析阶段自动对字符串候选进行哈希处理,以便与之匹配。
呃,它还是基于正则表达式的吗?
是也不是。当然,它像其他工具一样使用正则表达式来查找有类型的密钥。但语言理解(词法分析阶段)和变量检测在底层同样使用正则表达式。正则表达式是一种工具,而不是问题所在。问题在于脱离语义上下文盲目地应用正则表达式。
那 Semgrep Secrets 呢?看起来你是在抄袭他们的东西。
DeepSecrets 最初于 2023 年 4 月发布——比 Semgrep Secrets 推出早了六个月。我们有着相似的原则,但 DeepSecrets 是 100% 免费/开源的,并且利用了显著更广泛的多语言追踪范围。
其他工具只扫描它们已知的内容,而 DeepSecrets 利用词法分析器。这使它能够发现稀有配置格式和自定义代码块中隐藏的危险凭据,而这些是基准测试可能没有数据集的。
| 功能 / 能力 | DeepSecrets 2.2 | Gitleaks | TruffleHog | Semgrep Secrets |
|---|---|---|---|---|
| SecretBench 准确率 | 93% 召回率 79% 精确率 | 88% 召回率 46% 精确率 | 52% 召回率 6% 精确率 | 未评估 |
| 价格与许可 | 免费 / 开源 | 免费 / 开源 | 免费 / 开源 | 商业 / 付费 |
| 分析类型 | 语义 / 正则 | 纯文本正则 / 熵 | 纯文本正则 / 熵 | 语义 |
| 语言支持 | 500+ | 上下文无关(文本) | 上下文无关(文本) | 有限子集 |
| 预哈希验证 | 是(通过哈希引擎) | 否 | 否 | 否 |
| 上下文感知熵 | 是(已赋值) | 否(整个文件文本) | 否(整个文件文本) | 是 |
| 高级 SARIF 输出 | 是(动态置信度) | 基础 | 基础 | 是 |
你们为什么不构建真正的抽象语法树?这在学术上更正确!
DeepSecrets 试图在复杂性与有效性之间保持平衡。跨 500+ 种语言构建真正的 AST 极其复杂,对于密钥检测来说完全是过度设计。该工具遵循通用的 SAST 代码分析方法,但针对最大速度和广度优化了 AST 阶段。
我想构建自己的语义规则。该怎么做?
语义规则现在实际上就是“变量求值规则”。你可以在这里找到它们。
我还有其他问题
欢迎通过 pyproject.toml 中列出的电子邮件直接联系开发者。
有几个核心概念:
FileTokenizerTokenEngineFindingScanMode只是文件的一种 Python 式表示,带有管理所需的所有方法。
按照其逻辑将文件内容拆分成片段——Token。共有四种可用的分词器:
FullContentTokenizer:将所有内容视为单个 token。适用于基于正则的搜索。PerWordTokenizer:按单词和换行符拆分给定内容。LexerTokenizer:使用语言特定的智能机制将代码拆分为语义正确的片段,并为每个 token 提供附加上下文。CheapVarDetectorTokenizer:使用严格的正则表达式来弥补语义变量检测的局限性。一个字符串,附带有关其语义角色、对应文件及其内部位置的附加信息。
一个组件,按照自身逻辑对单个 token 执行密钥搜索。返回一组 Finding。共有三种可用的引擎:
RegexEngine:通过一套特殊规则集检查 token 的值SemanticEngine:使用额外上下文(变量名和值)检查由 LexerTokenizer 生成的 tokenHashedSecretEngine:通过对 token 的值进行哈希处理,并尝试在特殊规则集中查找匹配的哈希值来检查 token这是一种数据结构,表示在代码中检测到的问题。它包含有关文件中精确位置以及发现该问题的规则的信息。
该组件负责扫描过程。
PerFileAnalyzer——即针对每个文件调用的方法,返回发现列表。主要用途是初始化必要的引擎、分词器和规则集。当前实现包含一个 CliScanMode,由用户通过 CLI 参数提供的配置构建。
该项目预期使用 VSCode 和“远程容器”功能进行开发。
步骤: