可信时间:一个时间戳如何证明“何时”
Spec: RFC 3161RFC 3161Spec: RFC 5816RFC 5816Spec: ISO 32000-2, §12.8.5ISO 32000-2 §12.8.5
时间戳回答的是一个单一却出人意料地难以拿捏的问题:这份数据当时已经存在了吗? 不是谁做的,也不是它是否正确——只是说,在某个被指明的瞬间,这些确切的字节就已经存在于世。本页从最基础处把这个概念搭建起来:时间戳机构做了什么、一个令牌究竟包含什么,以及为什么一只时钟上的一个数字会成为证据。
它是聚焦于引擎的时间戳与可信时间的“第一性原理”伴读篇。如果“可信时间”听起来像行话,请先读这一篇。
为什么这很重要
标题为“为什么这很重要”的章节你电脑的时钟是一份自白,而不是证明。你可以把它设成任意值,别人也一样。一旦某个日期对第二方变得重要——一份必须在截止期前签署的合同、一条必须在争议发生前就存在的记录——你自己的时钟作为证据就一文不值,因为它由你掌控。可信时间的整个问题,就是找到一只你无法拨动的时钟。
这并非小众的顾虑。每一份长期存续的已签名 PDF 都倚赖它。一张签署证书终将过期;多年之后,验证者需要知道这个签名是在证书仍然有效时做出的。若没有一份关于“何时”的独立记录,这个问题就没有诚实的答案。可信时间,是支撑整座持久签名大厦的那块无声基石。
精简版
标题为“精简版”的章节- 时间戳证明一份数据在某个被陈述的瞬间之前就已存在。这是关于其年龄的一个上界,仅此而已。
- 它由第三方产出,即时间戳机构(TSA),你信任它的时钟,恰恰因为那不是你的。
- TSA 从不看到你的数据。它对数据的一个哈希值签名,把它绑定到一个时间值,并返回一个小小的已签名令牌。
- 这个令牌一并证明三件事:数据就是那份数据(哈希值相符)、时间就是 TSA 的时间(它的签名),以及回复对应于你送出的那个请求(它回显的 nonce,可防范被重放的旧响应)。
- 它并不证明是谁写了这份数据、数据是否为真,或确切的创建时刻。只证明:不晚于此。
- 信任流向 TSA。一个公开受信的 TSA 对大多数记录而言已足够好;一个符合 eIDAS 合格要求的 TSA 在欧盟则带有法律推定。
NextPDF 如何处理它
标题为“NextPDF 如何处理它”的章节先从这一切核心处的那个巧思说起。你想让一个陌生人为你的数据何时存在作证,但你又不能把数据给他们看——它可能是机密,而且无论如何它都可能非常庞大。所以你不给。你计算出一个哈希值:一个简短、定长的指纹,只要原始数据有哪怕一个字节改变,它就会彻底改变,而且无法从它反推出原始数据。你送出的是这个指纹,而不是文件。
TSA 拿到那个指纹,附上它自己的当前时间,用它的私钥对这一对签名,并交还一个时间戳令牌(Spec: RFC 3161, §2.1RFC 3161 §2.1)。这个令牌就是被永久固化的那个绑定:这个指纹、在这个时间、由我作证。 因为令牌是已签名的,任何人——哪怕是 TSA 事后——都无法在不破坏签名的情况下改动这个时间。因为它携带着你的指纹,它对任何其他文件都毫无用处。又因为请求包含一个全新的随机 nonce,且 TSA 会原样回显它,你便能判断这个回复对应于这个特定请求、而不是某个旧响应的重放——nonce 佐证的是新鲜度,而非是谁发起了请求(Spec: RFC 3161, §2.4.2RFC 3161 §2.4.2)。
不妨想象一封折叠信件上压着的一枚火漆印。印记并不读信;它只是证明,当印章按下去时,这封信是完整且在场的。一个时间戳,就是一枚由你并不拥有的时钟按下的印记,盖在你数据的指纹之上。
- Fingerprint the dataCompute a one-way hash of the file or the signature value. The data itself never leaves your hands.
- Ask the authoritySend the hash and a fresh random nonce to the Time-Stamp Authority.
- The TSA seals a timeIt signs the hash bound to its own clock and echoes your nonce, producing a small signed token.
- Store the tokenFor a PDF, the token is placed inside the file so the proof travels with the document.
- Verify laterAnyone who trusts the TSA can check the token: its signature against the TSA certificate, the matching hash, the echoed nonce, and the time — then concludes an upper bound on age.
在一份 PDF 里,同一套机制身兼两职。签名时间戳封存的是一个签名何时被施加,做法是为签名的值加上时间戳。文件时间戳封存的是整份文件何时存在,做法是对整份 PDF 做哈希(排除令牌将要占据的那个占位符),并把返回的令牌存回那个占位符(Spec: ISO 32000-2, §12.8.5ISO 32000-2 §12.8.5)。后一种,正是一份长期存续的归档签名在数年间反复续期、以保持其信任新鲜的那一种。
还有一个值得了解的现代细节:较旧的时间戳格式把自己钉死在某一种哈希算法上,用以命名 TSA 自己的证书。更新后的配置文件允许令牌改用一个当前的摘要来命名其证书(Spec: RFC 5816, §2.1RFC 5816 §2.1),这样可信时间就不会悄悄沿用昨日的密码学。
实践示例
标题为“实践示例”的章节你不会亲手组装一个令牌,你也不该想这么做。真正值得理解的是那道信任的接缝:你选择相信的是哪一只时钟。在 NextPDF 中,请求一个需要可信时间的签名等级,会让这个选择从隐式变为显式。
<?php
declare(strict_types=1);
use NextPDF\Security\Signature\SignatureLevel;
// A baseline signature trusts only the signer's own clock.$baseline = SignatureLevel::PAdES_B_B;$baseline->requiresTimestamp(); // false → no third party vouches for "when"
// Stepping up to B-T means a Time-Stamp Authority must be supplied:// from here on, "when" is attested by a clock you do not control.$timestamped = SignatureLevel::PAdES_B_T;$timestamped->requiresTimestamp(); // true → a TSA is now part of your trust model
// The decision is now visible at the call site, not buried in a default.// Choosing the TSA is choosing whose time becomes your evidence.这个示例的重点不是 API。它在于:“我是否拥有可信时间?”是一个关于你文档的“是”或“否”的事实,由是否有一个 TSA 参与其中所决定——而引擎拒绝让这个事实含糊不清。
常见误解
标题为“常见误解”的章节那个陷阱,是把时间戳读成*“这是在 14:32 创建的”。它根本没这么说。它说的是“这在 14:32 之前就已存在”*。这个区别正是全部要点。时间戳是一个上界,绝不是下界,也绝不是某个确切的时刻。你的数据可能在你抽空为它加时间戳之前就已经存在了好几年;令牌对此只字未提。它只划出一条线,并说:不在此之后。
第二个、代价更高的误解:以为时间戳证明你的文档是真实的或正确的。它两者都不证明。它对含义漠不关心。一个完美加了时间戳的谎言仍然是谎言——只是如今可被证明很“老”了。真实性来自那个说明是谁的签名;真伪则来自现实世界。时间戳谈的从头到尾只有何时。
限制与边界
标题为“限制与边界”的章节时间戳的能力范围,恰恰止步于它的信任模型所在之处。它证明的是关于年龄的一个上界,仅此而已,而且仅当你信任那个为它封印的机构时才成立。
有两个层级的机构值得加以区分。一个公开受信的 TSA 链接到一张你的软件已经接受的证书;它的令牌可被广泛验证,对大多数记录而言已足够。一个符合 eIDAS 合格要求的 TSA 是欧盟可信列表上一家受监管的提供方,而一个合格电子时间戳带有一项关于其日期准确性与数据完整性的法律推定——这是普通时间戳所不具备的推定(Spec: eIDAS, Art. 41eIDAS Art. 41)。在两者之间做选择,是一个关于你所需要的证据分量的问题,而不是关于字节如何运作的问题;其密码学是相同的。
时间戳同样继承了它自身信任锚的寿命。TSA 的证书可能过期或被撤销,它所用的哈希算法也可能老化淘汰。这恰恰是为什么长期存续的文件不会只加一次时间戳就一走了之——它们会续期,在旧证据变弱之前,把一个全新的文件时间戳层叠到旧证据之上。那套续期循环自成一个主题;参见长期验证。
| Edition | Availability |
|---|---|
| Core | Supports PAdES B-B and B-T. B-B is the baseline signature with no timestamp; B-T requests and embeds a verified RFC 3161 signature timestamp against a deployment-supplied TSA whose clock you choose. |
| Pro | Adds the embedded long-term validation data (certificates, OCSP, CRLs) that B-LT needs to keep a signature verifiable after its certificates expire. |
| Enterprise | Adds the B-LTA renewal loop, sealing the validation data under a fresh document timestamp and re-stamping it before the protection weakens. |
相关文件
标题为“相关文件”的章节- 时间戳与可信时间 — 同一套机制在引擎与 PAdES 层面,把验证规则一一摊开来说。
- 长期验证 — 续期文件时间戳如何让一个签名在数年间保持可验证。
- 一个签名如何证明是谁签的 — 本页搁置一旁的那“是谁”的另一半故事。
- 合格签名说明 — “合格”意味着什么,以及为什么一个合格的 TSA 带有法律分量。
词汇表
标题为“词汇表”的章节- 时间戳机构(TSA) — 一个签发已签名时间戳令牌的独立服务。你信任它的时钟,恰恰因为那不是你的。
- 时间戳令牌(Time-stamp token) — TSA 返回的那个小小的已签名对象,把你数据的一个哈希值绑定到一个时间值(Spec: RFC 3161, §2.1RFC 3161 §2.1)。
- 哈希(消息印记,message imprint) — 数据的一个简短、单向的指纹。TSA 对它签名,而绝不对数据本身签名,这样你的内容就保持私密。
- Nonce — 随请求一同送出、并在回复中被原样回显的一个全新随机数,表明令牌对应于那个特定请求、而不是某个旧响应的重放(它佐证的是新鲜度,而非请求者的身份)。
- 上界(Upper bound) — 时间戳所确立的内容:数据不晚于被陈述的瞬间就已存在。绝非某个确切的创建时刻。
- eIDAS 合格时间戳 — 来自欧盟一家受监管提供方的时间戳,带有一项关于日期准确性与数据完整性的法律推定。
- 文件时间戳(Document timestamp) — 覆盖整份 PDF 文件的时间戳,用以锚定并续期长期验证证据(Spec: ISO 32000-2, §12.8.5ISO 32000-2 §12.8.5)。