检测签名泄露

检测签名妥协

SignaturesCompromiseDetector 是本指南的入口点:它检查已签署文档的修订历史,以寻找内容在最后一次签名后被添加的指示,并将发现报告为 CompromiseCheckResult。这是本知识库集群覆盖的安全范围——它不涉及创建或应用签名,也不涉及文档加密;它仅检查文档上已存在的签名。


运行妥协检查

使用您想要检查的文档构建 SignaturesCompromiseDetector,然后调用 SignaturesCompromiseDetector.check()。该检查遍历文档上已存在的每个签名,寻找在最后一次签名修订后追加的未签名字节——这表明内容可能在之后被叠加——同时容忍由后续覆盖签名添加的合法长期验证材料(例如文档安全存储或归档时间戳)。


解释结果

SignaturesCompromiseDetector.check() 返回一个包含四个属性的 CompromiseCheckResult:

  • CompromiseCheckResult.has_compromised_signatures — 如果任何签名显示了篡改指示,则为 True。
  • CompromiseCheckResult.compromised — 镜像 CompromiseCheckResult.has_compromised_signatures,作为只读的便利别名提供。
  • CompromiseCheckResult.signatures_coverage — 检测器在文档上检查的签名数量。
  • CompromiseCheckResult.reasons — 一个简短字符串列表,描述文档被标记的原因及时间。

没有签名的文档,或根本没有文档,都会被报告为未受损,其中 CompromiseCheckResult.signatures_coverage 等于 0。


提示与最佳实践

  • 将 CompromiseCheckResult.compromised 和 CompromiseCheckResult.has_compromised_signatures 视为可互换——它们始终报告相同的值。
  • 在信任 False 结果之前检查 CompromiseCheckResult.signatures_coverage:0 的覆盖率表示检测器未找到可检查的签名,而不是说已有签名已被验证为完整。
  • 当 CompromiseCheckResult.has_compromised_signatures 为 True 时阅读 CompromiseCheckResult.reasons —— 该列表解释了触发了哪个启发式规则,这在记录日志或向审阅者展示结果时很有用。
  • SignaturesCompromiseDetector 检查修订历史以寻找篡改指示;它本身并不验证加密签名的完整性,因此在工作流中需要时,请将其与文档自身的签名验证结果配合使用。

常见问题

问题原因修复
CompromiseCheckResult.signatures_coverage 对于您知道已签名的文档是 0SignaturesCompromiseDetector 在未提供文档的情况下构建,或者文档对象没有可访问的签名在调用 SignaturesCompromiseDetector.check() 之前,请确认传递给 SignaturesCompromiseDetector 的文档公开了其签名
CompromiseCheckResult.reasons 为空,尽管您期待有解释CompromiseCheckResult.has_compromised_signatures 对于此文档是 False只有在实际发现妥协指示器时才会填充原因;在干净的结果中出现空列表是预期的
合法更新的 PDF(例如添加了长期验证时间戳的文件)会被标记为已妥协后续添加的内容未被后续签名完全覆盖,或未被识别为仅用于验证的材料在确认更新是由适当的覆盖签名或时间戳完成后重新运行检查,并检查 CompromiseCheckResult.reasons 以获取具体触发因素

FAQ

CompromiseCheckResult.compromised 实际检查什么?

它报告的数值与 CompromiseCheckResult.has_compromised_signatures 相同:即 SignaturesCompromiseDetector.check() 是否在文档的签名中发现任何篡改指示。

当 signatures_coverage 为 0 时,是否意味着文档是安全的?

不——这意味着没有找到可检查的签名。SignaturesCompromiseDetector 无法报告它看不到的签名,因此 0 覆盖率只是“无可检查”结果,而不是完整性的确认。

SignaturesCompromiseDetector 能创建或验证加密签名吗?

不。它仅检查文档已有的修订历史,以寻找内容在上一次签名之后被添加的迹象。创建、应用或密码学验证签名不在此类的职责范围内。

在签名后添加合法的时间戳是否总会触发妥协检测?

不一定。检测器旨在容忍随后由后续签名覆盖的后期添加,或仅添加验证材料而非新内容的情况。如果出现意外的检测结果,请查看 CompromiseCheckResult.reasons。


API Reference 摘要

类/方法描述
SignaturesCompromiseDetector在最后一次签名之后检查已签署文档的篡改指示器
SignaturesCompromiseDetector.check()运行检查并返回一个 CompromiseCheckResult
CompromiseCheckResult妥协检查的结果
CompromiseCheckResult.compromised只读别名对应 CompromiseCheckResult.has_compromised_signatures
CompromiseCheckResult.has_compromised_signatures是否检测到篡改指示器
CompromiseCheckResult.signatures_coverage检查的签名数量
CompromiseCheckResult.reasons简短字符串解释任何发现

另请参阅

 中文