全部文章

阅读约 5 分钟

封存文件前,先验证接收方

接收地址是一把公钥,而不是一个名字。在封存敏感文件之前,先通过可信渠道确认接收方的地址——加密可以做得天衣无缝,却仍然把文件发给了错误的人。

在封存敏感文件之前,先通过一个攻击者难以掌控的渠道,验证接收方的接收地址。接收地址是一把公钥,而不是一个名字。如果你把文件加密给了错误的密钥,那么持有这把错误密钥的人就可能打开文件——而你真正想送达的那个人,反倒打不开。

这是加密工作流中最常见的人为失误。密码学可以做得无懈可击,发送本身却仍然可能出错,因为一串字符本身并不能证明它属于谁。加密回答的是「谁能打开这些字节?」,它回答不了「我选对人了吗?」。

什么是接收地址?

接收地址是发送方用来封存记录的一把加密公钥。在 CardanoWall 中,它有两种形态:

  • age1...——经典的 X25519 接收地址。
  • age1pqc...——混合后量子接收地址。

发送方将记录封存给接收方公开的地址。接收方再用对应的私钥打开记录,这把私钥派生自他们的身份种子。地址是用来分享的;私钥和种子则必须保密。(关于地址究竟是什么、接收方如何把它分发出去,详见什么是接收地址。)

为什么验证密钥如此重要?

因为公钥不等于身份。

任何人都能发给你一串看起来像接收地址的字符。任何人都能把一把密钥贴在某个熟悉的显示名旁边。这串字符本身,并不能证明是谁掌控着对应的私钥——它只能说明某个密钥持有者掌控着它。如果攻击者把自己的地址塞给你,那么你以为「发给」联系人的所有封存内容,他都能读到,而你的联系人却什么也收不到。

对一个随手测试的文件来说,这或许无关紧要。但如果是法律证据、事件数据、个人信息、未公开的作品,或是举报人材料,那就务必在封存之前验证密钥。通讯录的存在,正是为了让这次验证一劳永逸:你验证密钥一次,把它保存下来,之后直接复用保存好的条目,而不必每次都重新粘贴一串还得再次去信任的字符。

什么才算一个好的验证渠道?

走一条攻击者难以掌控的路径,并且通过一个有别于密钥送达渠道的独立渠道来确认密钥。下面是一些合理的选择,大致按可靠性从强到弱排列:

  • 当面交接(例如一起扫描一个二维码)。
  • 拨打一个你早已知道的号码,把密钥指纹念出来核对。
  • 接收方官方域名上的 .well-known 密钥页面。
  • 该域名上的一条 DNS TXT 记录。
  • 从接收方官方网站链接出来的一份已签名的个人资料。
  • 一段你早已信任的、现有的端到端加密对话。
  • 一个经组织批准的密钥目录。
  • 通过一套你信任的流程交付的、打印出来的密钥指纹。

具体用哪种方法,取决于你要发送的是什么。对于高价值文件,请通过两条相互独立的渠道来确认——一把既通过邮件发给你、在电话里念回来核对过的密钥,要比单凭其中任何一条难伪造得多。

哪些做法单凭自身还不够?

光有一个熟悉的名字是不够的。在第二条渠道确认之前,请把下面这些都当作未经验证:

  • 在一个全新邮件会话里冒出来的密钥。
  • 来自一个你尚未验证的账号的私信。
  • 一张密钥的截图。
  • 一份没有可信链接指回本人的公开资料。
  • 由第三方转发给你的一个地址。
  • 一条「这是我的新密钥」的消息,却没有任何第二渠道核对。

攻击者会把火力集中在密钥交换的那一刻,因为这是唯一一个被掉包的密钥看上去完全正常的环节。一旦一把错误的密钥被保存下来,此后每一次发送都可能不动声色地继续发往错误的目的地。

你该如何使用通讯录?

在验证密钥之后再保存,绝不要在验证之前就保存。对每一位可信联系人,通讯录会记录:

  • 一个显示名。
  • 该联系人的 Ed25519 签名公钥(把他们的记录与本人绑定在一起的标识符)。
  • 一个 age1... 接收地址,如果他们有的话。
  • 一个 age1pqc... 后量子接收地址,如果他们有的话。
  • 你是如何验证这把密钥的,以及在何时验证的。
  • 自由格式的备注——把你具体是怎么核对的写清楚。

之后,当你撰写一条封存记录时,直接从通讯录里挑选联系人,而不必再次粘贴地址。这样,一次审慎的验证就能换来许多次更安全的发送。想了解如何建立通讯录,详见创建你的通讯录通讯录的工作原理

你该优先选用后量子地址吗?

对于那些可能在很多年里都保持敏感的文件,是的——只要接收方提供,就选用后量子地址。

一个混合的 age1pqc... 地址比经典地址长得多,但它能防范这样一种攻击者:今天先记录下封存的密文,将来再用一台量子计算机把它解密(即「先存储,后解密」)。如果一条记录只需要在近期保持私密,那么一个经典的 age1... 地址通常就够用了。

无论你选哪一种,规则都不变:先验证地址。一把你没有验证过的后量子密钥,并不比一把你没有验证过的经典密钥更安全。

如果接收方更换了密钥怎么办?

把这把新密钥当作一个新联系人来验证。不要仅仅因为一条消息声称密钥变了,就覆盖掉已保存的接收地址——这恰恰是一次密钥替换攻击的典型套路。请通过可信渠道确认新密钥,再更新条目,并记下它为什么改了。

对于团队和组织,密钥更换应当在可预期的地方公布:一个官方域名、一份已签名的个人资料,或一套有据可查的内部流程。如果你怀疑某把密钥已经泄露,请立即停止向旧地址封存,并等待新地址得到确认。

一条封存记录在链上会暴露什么?

不会暴露一份可读的接收方名单。一条 Label 309 封存记录会把内容密钥包进按接收方划分的加密密钥槽里(每位接收方一个),再把这些密钥槽打乱顺序,于是公开记录中并不带任何明文的「接收方」字段。收件箱靠的是用你自己的密钥在本地逐个试解每个密钥槽,从中找出发给你的记录。观察者看到的,是存在这样一条封存记录、它是何时发布的、以及它有多少个密钥槽——但永远看不到接收方是谁。

这种接收方盲性保护的是链上隐私,对密钥验证却毫无帮助。链隐藏的是你封存给了;它无法核对你是否封存给了正确的密钥。挑对地址,仍然完全是发送方的责任。还要注意另一侧的限度:封存能让明文对密钥持有者保持加密状态,但它并不保证匿名性,而任何接收方在解密之后,都可能把明文泄露出去。(关于一份证明能确立什么、不能确立什么,详见一份证明无法证明什么。)

简短版

再好的加密,配上一次糟糕的密钥核对,仍然是一次糟糕的发送。所以:

  • 在封存任何敏感内容之前先验证接收地址,最好通过两条渠道。
  • 把验证过的密钥保存进通讯录;记下每一把是怎么核对的。
  • 密钥变更时重新验证——把新密钥当作一个全新的联系人来对待。

密码学是容易的那部分。验证,才是真正归你掌控的那部分。

延伸阅读

securitysealed-poeaddress-book