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

在封存敏感文件之前,先通过一个攻击者难以掌控的渠道,验证接收方的接收地址。接收地址是一把公钥,而不是一个名字。如果你把文件加密给了错误的密钥,那么持有这把错误密钥的人就可能打开文件——而你真正想送达的那个人,反倒打不开。
这是加密工作流中最常见的人为失误。密码学可以做得无懈可击,发送本身却仍然可能出错,因为一串字符本身并不能证明它属于谁。加密回答的是「谁能打开这些字节?」,它回答不了「我选对人了吗?」。
什么是接收地址?
接收地址是发送方用来封存记录的一把加密公钥。在 CardanoWall 中,它有两种形态:
age1...——经典的 X25519 接收地址。age1pqc...——混合后量子接收地址。
发送方将记录封存给接收方公开的地址。接收方再用对应的私钥打开记录,这把私钥派生自他们的身份种子。地址是用来分享的;私钥和种子则必须保密。(关于地址究竟是什么、接收方如何把它分发出去,详见什么是接收地址。)
为什么验证密钥如此重要?
因为公钥不等于身份。
任何人都能发给你一串看起来像接收地址的字符。任何人都能把一把密钥贴在某个熟悉的显示名旁边。这串字符本身,并不能证明是谁掌控着对应的私钥——它只能说明某个密钥持有者掌控着它。如果攻击者把自己的地址塞给你,那么你以为「发给」联系人的所有封存内容,他都能读到,而你的联系人却什么也收不到。
对一个随手测试的文件来说,这或许无关紧要。但如果是法律证据、事件数据、个人信息、未公开的作品,或是举报人材料,那就务必在封存之前验证密钥。通讯录的存在,正是为了让这次验证一劳永逸:你验证密钥一次,把它保存下来,之后直接复用保存好的条目,而不必每次都重新粘贴一串还得再次去信任的字符。
什么才算一个好的验证渠道?
走一条攻击者难以掌控的路径,并且通过一个有别于密钥送达渠道的独立渠道来确认密钥。下面是一些合理的选择,大致按可靠性从强到弱排列:
- 当面交接(例如一起扫描一个二维码)。
- 拨打一个你早已知道的号码,把密钥指纹念出来核对。
- 接收方官方域名上的
.well-known密钥页面。 - 该域名上的一条 DNS TXT 记录。
- 从接收方官方网站链接出来的一份已签名的个人资料。
- 一段你早已信任的、现有的端到端加密对话。
- 一个经组织批准的密钥目录。
- 通过一套你信任的流程交付的、打印出来的密钥指纹。
具体用哪种方法,取决于你要发送的是什么。对于高价值文件,请通过两条相互独立的渠道来确认——一把既通过邮件发给你、又在电话里念回来核对过的密钥,要比单凭其中任何一条难伪造得多。
哪些做法单凭自身还不够?
光有一个熟悉的名字是不够的。在第二条渠道确认之前,请把下面这些都当作未经验证:
- 在一个全新邮件会话里冒出来的密钥。
- 来自一个你尚未验证的账号的私信。
- 一张密钥的截图。
- 一份没有可信链接指回本人的公开资料。
- 由第三方转发给你的一个地址。
- 一条「这是我的新密钥」的消息,却没有任何第二渠道核对。
攻击者会把火力集中在密钥交换的那一刻,因为这是唯一一个被掉包的密钥看上去完全正常的环节。一旦一把错误的密钥被保存下来,此后每一次发送都可能不动声色地继续发往错误的目的地。
你该如何使用通讯录?
在验证密钥之后再保存,绝不要在验证之前就保存。对每一位可信联系人,通讯录会记录:
- 一个显示名。
- 该联系人的 Ed25519 签名公钥(把他们的记录与本人绑定在一起的标识符)。
- 一个
age1...接收地址,如果他们有的话。 - 一个
age1pqc...后量子接收地址,如果他们有的话。 - 你是如何验证这把密钥的,以及在何时验证的。
- 自由格式的备注——把你具体是怎么核对的写清楚。
之后,当你撰写一条封存记录时,直接从通讯录里挑选联系人,而不必再次粘贴地址。这样,一次审慎的验证就能换来许多次更安全的发送。想了解如何建立通讯录,详见创建你的通讯录和通讯录的工作原理。
你该优先选用后量子地址吗?
对于那些可能在很多年里都保持敏感的文件,是的——只要接收方提供,就选用后量子地址。
一个混合的 age1pqc... 地址比经典地址长得多,但它能防范这样一种攻击者:今天先记录下封存的密文,将来再用一台量子计算机把它解密(即「先存储,后解密」)。如果一条记录只需要在近期保持私密,那么一个经典的 age1... 地址通常就够用了。
无论你选哪一种,规则都不变:先验证地址。一把你没有验证过的后量子密钥,并不比一把你没有验证过的经典密钥更安全。
如果接收方更换了密钥怎么办?
把这把新密钥当作一个新联系人来验证。不要仅仅因为一条消息声称密钥变了,就覆盖掉已保存的接收地址——这恰恰是一次密钥替换攻击的典型套路。请通过可信渠道确认新密钥,再更新条目,并记下它为什么改了。
对于团队和组织,密钥更换应当在可预期的地方公布:一个官方域名、一份已签名的个人资料,或一套有据可查的内部流程。如果你怀疑某把密钥已经泄露,请立即停止向旧地址封存,并等待新地址得到确认。
一条封存记录在链上会暴露什么?
不会暴露一份可读的接收方名单。一条 Label 309 封存记录会把内容密钥包进按接收方划分的加密密钥槽里(每位接收方一个),再把这些密钥槽打乱顺序,于是公开记录中并不带任何明文的「接收方」字段。收件箱靠的是用你自己的密钥在本地逐个试解每个密钥槽,从中找出发给你的记录。观察者能看到的,是存在这样一条封存记录、它是何时发布的、以及它有多少个密钥槽——但永远看不到接收方是谁。
这种接收方盲性保护的是链上隐私,对密钥验证却毫无帮助。链隐藏的是你封存给了谁;它无法核对你是否封存给了正确的密钥。挑对地址,仍然完全是发送方的责任。还要注意另一侧的限度:封存能让明文对密钥持有者保持加密状态,但它并不保证匿名性,而任何接收方在解密之后,都可能把明文泄露出去。(关于一份证明能确立什么、不能确立什么,详见一份证明无法证明什么。)
简短版
再好的加密,配上一次糟糕的密钥核对,仍然是一次糟糕的发送。所以:
- 在封存任何敏感内容之前先验证接收地址,最好通过两条渠道。
- 把验证过的密钥保存进通讯录;记下每一把是怎么核对的。
- 密钥变更时重新验证——把新密钥当作一个全新的联系人来对待。
密码学是容易的那部分。验证,才是真正归你掌控的那部分。
延伸阅读
- 什么是接收地址以及公开资料与接收地址。
- 如何接收封存记录以及不公开文件的机密披露。
- 收件箱的白名单模式——一个针对你所接收内容的互补型收件箱过滤器。
- 开放的 Label 309 标准见 label309.org;开源代码、SDK 和 CLI 见 github.com/cardanowall。