摘要

  • 一份 2026 年 9 月 5 日发布的个人 Internet-Draft,以一个 165 字节的 COSE_Sign1 对象为起点,组合测试了六个二元 CBOR 编码自由度。
  • 64 种组合产生 64 份不同字节与 64 个不同 data-hash,没有哈希碰撞;但 64 份消息的 Sig_structure 都是同一份 109 字节结构,签名均可验证。
  • 测试用解码器没有拒绝任何输入,其中 31 份在“解码后再编码”时悄然变回起始字节,过程中没有错误提示。
  • 我用哈希一致的公开制品和公开脚本做了独立复算,重现了 64、0、31 三个核心结果及起始对象的字节哈希。
  • 这不是已部署事故、签名伪造或密码算法失效。它要求标识符发布方说明哈希的确切预映像,并保存足以重算它的字节证据。

一条消息同时承载两种“相同”

COSE 签名判断的是受保护内容是否与密钥相符。依照 RFC 9052,验签所用的 Sig_structure 包含规定的上下文、受保护头、外部认证数据和载荷;外层 CBOR 容器的每一种表现形式并不都进入签名输入。

本次测量讨论的 data-hash 则观察整份传输字节。它可以被当作检索键、去重键或后续证明的对象。因此,两个系统可能都认定签名有效、也都读出相同字段,却因为保留了不同的序列化形式而得到不同标识符。

这两种结论并不冲突。“语义对象相同”与“线上的每个字节相同”本来就是两项承诺。治理风险来自把前者当成后者的证据。

六个开关如何展开成 64 个身份

测量草案把起始对象称为 A,长度为 165 字节。实验不改任何元素值,只切换六项编码选择:是否带 CBOR 标签 18;外层数组采用确定或不确定长度;未保护头映射采用确定或不确定长度;受保护头、载荷和签名三个字节串分别采用整体或分块写法。

六个二元开关恰好给出 64 种组合。公开测量制品记录的序列长度介于 164 至 170 字节,每份 SHA-256 都不同,没有碰撞。与此同时,所有组合的 Sig_structure 只有一种,长度 109 字节;所以同一签名在 64 种编码上都通过。

64 不是上限。实验没有改变整数编码宽度,也没有排列映射键。RFC 8949所容纳的表示空间更大。仅逐项禁止目前发现的写法,无法证明没有遗漏下一种等价编码。

解析成功,证据却已经被换掉

测试中的 64 份输入全部被普通解码器接受。更值得运营方注意的是,其中 31 份经过一次解码与重新编码后,输出完全变成 A。应用得到的是可用对象,日志里却没有一条错误说明“接收时的字节已经不存在”。

于是,一条很普通的数据路径就会断开证据链:服务收到 B,先发布 hash(B),随后解码 B,只保存库重新写出的 A。日后它仍能验签,也能呈现相同字段,但无法用现有副本重算 hash(B)。如果这个哈希还是公开索引或另一份证明的目标,标识符与库存对象便各走一条路。

“静默”描述的是可观察行为,不是对软件或作者动机的判断。这项实验没有审计任何真实透明服务,也没有测量这种路径在生产中的比例。它只证明:没有解析错误,不能替代字节保管证明。

独立复算验证了数字,没有扩大结论

草案公开了起始向量、64 项结果和生成脚本。由于 GitHub 原始文件端点连接失败,我改从 Contents API 取得同一脚本,并在临时目录与隔离 Python 环境中,针对哈希一致的两份 JSON 副本运行。

复算得到的 A 仍是 SHA-256 8595e4a4c8b93e7b1b7b798dc302a2b7d2890021f7eff372d79b32f78867e4ac,并再次得到 64 个不同 data-hash、0 次拒绝、31 次归一化。我的环境使用 cbor2 5.7.1;草案报告的是 6.1.3、CPython 3.13 与 macOS arm64。跨版本一致增强了核心计数的可信度,但不是全面互操作测试。

Datatracker把该文档列为个人提交,明确没有 IETF 背书或标准流程中的正式地位,也没有 RFC 流与负责的领域主管。草案本身说它不规定任何规范文字。实验没有伪造签名,没有制造碰撞,没有攻破 SHA-256,也没有声称真实服务发生事故。

“按注册时字节”仍是讨论意见

这项测量进入了 CCF COSE 回执配置的 Last Call 讨论。Nicholas Templeman 在 9 月 5 日的邮件中支持草案推进,同时建议把 data-hash 明确绑定到“注册时”的字节,而不是任何重新序列化结果;他还明确说这不是阻塞意见。

邮件是参与者输入,不是 IETF 共识或已经采纳的文本。SCITT Reference APIs 草案和 CCF 配置都仍在演进。RFC 9943已经定义 SCITT 架构中的签名声明、注册与回执角色,但不会自动决定后来 data-hash 的精确预映像。

更早的个人草案 Canonical Payload Binding已经提出 as-transmitted:不做规范化,以原样字节序列作为预映像;其中 jcs-n 与 cde-n 已标为 Withdrawn。新实验的价值在于量化既有问题,而非把既有提议变成标准。