1. 随报告一同传递的东西
三个值让报告自验证。它们出现在报告制品上,以及链接的公共共享 门户元数据上。content_hash —— 证据的 SHA-256
content_hash —— 证据的 SHA-256
报告规范化证据 JSON 的一个小写十六进制 SHA-256 摘要。对于
给定的报告,这些字节是确定的,所以任何持有相同证据的人都能
重新计算出相同的哈希。对证据的任何编辑都会改变这个值。
signature —— 针对哈希的 Ed25519
signature —— 针对哈希的 Ed25519
一个针对十六进制
content_hash 计算的 base64 Ed25519 签名。
它证明该哈希由 OrcaRouter 的签名密钥签署,未被伪造。sig_key_id —— 哪个密钥签的它
sig_key_id —— 哪个密钥签的它
活跃公钥的一个短而稳定的标识符(例如
orca- 后跟一段
十六进制片段)。验证者用它来确认报告由当前已发布的密钥签署
——由未知密钥 id 签署的报告会故障关闭。签名覆盖的是内容哈希,而非直接覆盖渲染出的 PDF、CSV 或 JSON
字节。同一份证据从一个哈希渲染为全部三种格式,所以完整性保证
落在底层证据上——给定报告的每次导出都共享同一个
content_hash、
signature 和 sig_key_id。2. 获取公钥
签名公钥发布在一个开放端点上——无需认证、无需工作区上下文。 审计员直接调用它。public_key 是 base64 编码的 32 字节 Ed25519 公钥。这里的
key_id 必须与报告上的 sig_key_id 匹配——如果不匹配,报告就是
由一个不同的(很可能已轮换或更旧的)密钥签署的,且不会针对这个
已发布的密钥验证通过。
3. 验证签名
你可以用两种方式验证签名。要么请 OrcaRouter 为你检查这个元组, 要么用已发布的公钥完全离线验证。托管的验证端点
把报告中的三个值 POST 到开放的验证端点。它是公共的——审计员 不带任何凭据调用它。valid: true 意味着签名针对该密钥 id 的活跃密钥校验通过。
valid: false 意味着要么签名与哈希不匹配、哈希为空,要么
sig_key_id 与当前已发布的密钥不匹配。
用公钥离线验证
一位多疑的审计员根本不需要信任验证端点。因为算法是针对十六进制 内容哈希的标准 Ed25519,签名可以用任何加密库检查:4. 签名覆盖什么
签名证明报告的content_hash 由 OrcaRouter 签署,而哈希证明证据
未被编辑。有一处微妙之处:哈希是针对网关构建的证据的规范化
形式计算的——而非 JSON 或 PDF 文件的原始字节。所以你自己
重新哈希下载的制品不会重现 content_hash。请使用验证端点
(§2/§3),它会为你重新计算规范化哈希并检查 Ed25519 签名:
| 检查 | 含义 |
|---|---|
signature_valid: true | content_hash 由 OrcaRouter 的密钥签署——证据真实且未被编辑。 |
| 密钥 id 匹配 | 报告 sig_key_id == 已发布的密钥 id → 由活跃密钥签署。 |
5. 验证一份共享报告
当你给审计员发送一个 共享门户链接 而不是文件时,门户元数据已经携带content_hash、signature 和
sig_key_id,外加一个服务端计算的 signature_valid 标志。审计员
既可以信任该标志,又可以针对公钥独立重跑上面的检查——共享
门户无需登录,验证路径完全相同。
6. 接下来去哪里
签名报告
一份签名报告如何生成、它捕获什么证据,以及如何铸造一个
审计员共享链接。
导出证据
把报告证据拉取为 PDF、CSV 或 JSON,供你审计员的工作底稿。
数据驻留
报告上的区域戳记如何治理它存储和提供服务的位置。
责任共担
OrcaRouter 在网关路径上保证什么、什么仍是你的。
