通俗讲解

通俗讲解 · 第 7 部分,共 7 部分

标准为何经久不衰

你今天做出的一份证明,也许需要在三十年后依然站得住脚。设想一项科研发现,它「最先提出」的主张在数十年后仍要经得起核查;又或者一批合同档案,要在当年签署的人都早已各奔东西之后,再由某个人去验证。对于这样的证明,「今天能用」是不够的,它必须在一个谁也无法预见的未来里,长长久久地继续有效。

这是个实实在在的难题,因为这些证明背后的数学并不会停在原地。

好方法不会永远好下去

每一种密码学方法,都建立在某种「做起来容易、倒推回去却几乎不可能」的运算之上。随着时间推移,会发生两件事:计算机越来越快,研究者越来越聪明,于是一种本来看似坚如磐石的方法,可能会慢慢变弱;与此同时,全新的方法不断被发明出来,比我们手头有过的任何方法都更强。

所以,任何一份诚实的标准都得面对一个绕不开的事实:今天能用上的最好方法,不会永远是最好的方法。总会有更新、更好的方法出现。

为什么把一种方法写死会是个陷阱

设想有这样一份标准,它干脆规定「永远只用这一种特定的方法」。它会运转得相当漂亮,直到那种方法变弱的那一天。届时你就被困住了:要换到更好的方法,你得重写规则,让所有人在同一天一起切换,还得设法处理旧规则下做出的每一份证明。这种「所有人同时换」的时刻,恰恰最容易割裂历史、让旧记录无人接管。以这种方式搭起来的标准,从发布那一刻起就在悄悄腐烂。

Label 309 压根就不指定某一种固定的方法,从一开始就绕开了这整个陷阱。

一份你可以不断往里添的目录

Label 309 不把某一种方法焊死在标准里,而是用一份开放清单(也就是一张注册表)里的名字来指代每一种方法。可以把它想象成一份零件目录:每一份证明都按名字记下自己是用哪些「零件」搭起来的,哪种方法负责生成指纹,哪种方法负责密封,哪种方法负责签名。

每一类零件都有各自单独的目录(哈希一份,密封一份,签名一份,等等),而往任何一份里添东西,严格来说都只是增补

  • 新方法必须是一份真实、已发布、带有公开参考文献(RFC、NIST 出版物之类)的标准,不允许使用自创的密码学
  • 它会在目录里拿到一个新名字,并配上一个测试用例,把它的行为精确钉死。

等更强的方法出现时,你不会撕掉目录,也不会重印旧的那几页,只是添上新的一页,旧的那些页则永远原封不动地留在那里。这里还有一处巧妙得不动声色的设计:每一份做出来过的证明,都把当初的零件列在它自己那一页上。去查一份旧证明,目录依旧会精确地告诉你该怎么核查它,因为它的零件从来没被拿掉,只是又添进来了更新的零件而已。

于是,两件事同时成立:

  • 旧证明始终都能验证。 一份多年前做出的证明,它点名的那些方法仍在目录里,所以今天核查它,跟它做出来那天一样查得通。
  • 新证明可以挑最新的方法。 谁要做一份新证明,只需从清单里挑一个更新的名字即可。

这里没有什么「大限之日」,没有所有人必须一起切换的那一刻,历史不会被割裂,也不必手忙脚乱地去转换一大堆旧记录。这种变动是纯粹的增补,是清单上添的一个新条目,从来不是替换。添一个条目,甚至连格式的版本号都不会变:一个从没听说过某个新名字的验证器,只会干干净净地回一句「这个我还不支持」,既不会崩溃,也不会乱猜。

量子那一跃,也是这么迈过去的

你也许听说过,强大的新型计算机有朝一日可能攻破今天的某些密码学。(有一篇配套文章专门讲这个。)让人安心的是,在 Label 309 里,要防住它根本不需要什么特别的救援方案,做的还是和其他每一次改进一模一样的动作:把新的、抗量子的方法添进目录。事实上,这件事已经发生过一次了:后量子的密封方法已经和经典方法并排添了进来,于是新记录今天就用上它,旧记录则照旧、丝毫不受影响。一个听上去仿佛非得推倒重来才能应对的威胁,到头来不过是目录里又添的一页。

天生就能比自己用的方法活得更久

任何一份证明里用到的方法,终有一天都会退役,这很正常,Label 309 早就料到了。真正经久不衰的是目录本身:一套你只会往里加、从不往外删的开放注册表,每一份证明都把它当初的零件永久存档。想了解它们如何在不丢下任何一份旧证明的前提下不断壮大,参见算法注册表