PAYATHON 2026

如何用密码学证明文件在某个时间点前已存在?

数据小陈

结论

可以把文件的 SHA-256 哈希提交到公开时间线,并保留可独立验证的时间戳证明。OpenTimestamps 是一种常见方案:它将文件哈希纳入摘要结构,再把摘要锚定到 Bitcoin 区块链。验证者取得原文件和证明文件后,可以自行检查两者的锚定关系,无需登录签发平台。

这类证明说明,与该哈希对应的内容在相关区块被记录时已经存在。它不能证明文件的作者或创建地点,也不能确定文件恰好在哪个时刻创建。

为什么单独的哈希不够

SHA-256 可以识别文件内容。文件内容一旦变化,计算出的哈希通常也会变化。但哈希本身不带可信的时间信息,任何人都可以在之后计算出同一个文件的哈希。

下面的 Python 示例计算 contract.pdf 的 SHA-256:

import hashlib

with open("contract.pdf", "rb") as f:
    sha256 = hashlib.sha256(f.read()).hexdigest()

print(sha256)

文件系统时间戳可以修改。单一平台提供的时间记录也依赖该平台的记录,以及其服务是否持续可用。将哈希锚定到公开时间线后,验证者可以检查公开记录与文件内容是否对应。

操作流程

  1. 计算文件哈希。 为需要证明的原始文件计算 SHA-256。验证时必须使用内容相同的文件;重新导出或修改文件都可能改变哈希。
  2. 生成时间戳证明。 使用 OpenTimestamps 等工具为文件生成证明。证明通常保存在旁车文件中,例如 .ots 文件。
  3. 等待锚定完成。 提交证明后,可能需要等待区块链确认。锚定尚未完成的证明,不能视为已经写入公开时间线。
  4. 一并保存文件和证明。 归档原文件、证明文件,以及所用工具的必要信息。将证明文件与原文件一并交给第三方。
  5. 由第三方独立验证。 验证者使用兼容工具检查原文件是否与证明中的哈希相符,并确认该证明能否追溯到公开锚点。验证时无需相信原提交平台的账户或内部时间记录。

证明能说明什么

链上锚定为哈希提供公开的时间顺序证据。验证通过,说明与文件内容对应的哈希不晚于锚定记录出现。区块时间不是精确的民用时钟读数,因此不能将它当作文件创建的秒级时间。

如果需要特定机构为时间出具责任背书,可以考虑 RFC 3161 时间戳服务。它的信任模型不同于公开区块链锚定:验证者需要检查时间戳令牌及其签名链,并依赖相应时间戳机构的密钥和政策。若目标是减少对平台的依赖并支持公开验证,公开锚定更合适;也可以同时保存两种证据。

注意事项

  • 哈希证明绑定的是字节内容,不能自动证明文件身份、签署人或法律效力。
  • 妥善保存原文件和证明文件。只有哈希而没有原文件,第三方就无法确认待验证文件是否与该哈希匹配。
  • 公开时间线提供可验证的锚定记录。其抗篡改能力取决于底层网络和共识机制,不能说它在数学意义上绝对不可更改。
  • 如果文件含有敏感内容,通常只需公开其哈希或哈希摘要,不要把文件内容提交到公开网络。

备注:内容仅供参考。