阅读约 7 分钟
CardanoWall 如何存储你的身份
CardanoWall 把你的身份存为加密保险库的密文,绝不存明文种子。本文讲清服务端究竟保存了什么、只有你的通行密钥才能打开什么,以及为什么你的种子才是真正的备份。

CardanoWall 绝不会以明文形式存储你的身份种子。服务端保存的是一份加密保险库,只有你自己的通行密钥才能打开它,外加运行你账户所需的那些公开、非机密的数据。种子本身——也就是那份真正构成你身份的东西——始终留在你这一侧。
用一句话概括这个心智模型:你的身份种子才是可携带的身份,也是真正的备份;托管的保险库只是一层由通行密钥解锁的便利层,而非托管。
本文将带你了解 CardanoWall 存了什么、它刻意无法读取什么,以及当出问题时这一切意味着什么。
什么是身份种子,它为什么重要?
一个 CardanoWall 身份由一份 32 字节的身份种子构建而来。从这份种子出发,确定性的密钥派生会生成你实际使用的密钥:一把用于给记录签名的 Ed25519 密钥,以及若干用于接收封存文件、基于 X25519 的密钥。无论在何处——网站、命令行工具、各个 SDK,或任何遵循开放的 Label 309 派生规则的软件——同样的这 32 字节总会重建出同一个身份。
这正是关键所在:种子是可携带的,并且它决定一切。密钥都是它的下游产物。所以对存储而言唯一重要的问题,就是这份种子存在哪里。
答案是:在你这里。CardanoWall 可以为便利起见保留一份加密副本,但它存储的是密文,而非可读的种子。
CardanoWall 实际存储了什么?
CardanoWall 存储运行你账户所需的服务数据。其中包括:
- 你的账户登录状态;
- 计费与余额记录;
- 你的公开身份密钥;
- 公开的证明记录与 Cardano 交易引用;
- 加密的身份保险库密文;
- 仅以哈希形式保存的 API 密钥;
- 产品设置,例如每个身份的生命周期状态;
- 你的通讯录条目与收件箱偏好设置。
请注意哪些东西不在这份清单上。你的身份种子、你派生出的私有签名密钥、你派生出的私有接收密钥,以及任何已解密的封存文件,全都是客户端机密。它们绝不会存进任何可读的服务端字段。加密保险库是服务端唯一保存任何与种子相关内容的地方,而它保存的是自己无法打开的密文。
想完整了解服务能看到什么、又有哪些只留在你的设备上,请参阅CardanoWall 能看到什么。
身份保险库是什么?
身份保险库是一个单一的加密包,里面装着你账户下各个身份的机密。
在保险库的明文内部,每个条目都包含一个身份的 32 字节种子,以及你为它选的私有显示标签——「个人」「新闻团队」,或者你输入的任何名字。(一个账户可以持有多个身份,每个身份各占一个条目。)标签同样被封在加密之内,因此绝不会在服务端暴露。
在这一切被存储之前,它已经过加密。CardanoWall 把加密结果以 age v1 格式保存下来,每个账户只保留当前的那一行保险库。服务端可以持有这份密文并在你需要时交还给你,但它并不持有打开它所需的密钥材料。
这正是要点所在:保险库不是托管,它是一份加密的便利缓存。规范、可携带的产物,仍然是种子。
是什么解锁保险库?
是你注册的通行密钥解锁了它——别的什么都不行。
保险库只对支持 PRF(伪随机函数)扩展的 WebAuthn 通行密钥因子加密,每把通行密钥对应一个接收方信封段。托管的保险库里刻意没有由密码派生的信封段,也没有公钥信封段。在一次解锁过程中,你的认证器执行用户验证,并向浏览器释放由 PRF 派生的密钥材料;这份材料会在本地打开保险库。
CardanoWall 的服务端从不会收到明文种子、已解密的保险库,或任何由种子派生出的私钥。在服务端看来,它所知道的全部就是:某个账户已通过认证,而它可以把一团密文交还出去。真正打开它的,是由你的通行密钥操作驱动的浏览器。
想了解通行密钥如何提供这把锁,以及不同类型通行密钥在恢复上的取舍,请参阅通行密钥如何保护你的身份保险库。
为什么不干脆把种子存在服务端?
因为那会把 CardanoWall 变成你身份的托管方——而托管恰恰是这套设计要避免的失效模式。
如果一个服务存储明文种子,或者存储自己能解密的种子,那么一次服务端泄露就可能演变成一次用户密钥泄露。窃取了数据库或服务端密钥的攻击者,或许就能冒充用户签名,或解密他们的封存记录。这是一个会引发灾难性后果的单点故障。
CardanoWall 围绕着另一种承诺构建:一次数据库泄露不应暴露身份种子,因为服务端从不持有打开它们的材料。这套设计的用意,是让一次假想的泄露虽然严重,却不会对你的密钥造成灾难性后果。
「仅对通行密钥加密」这一选择,有两个值得点明的具体后果。由于没有由密码派生的信封段,被窃的保险库没有任何可供暴力破解的东西——根本不存在一个人为选定、可供逐一试解的口令。又由于没有公钥信封段,未来的量子(Shor 式)攻击也没有任何非对称目标可瞄准;保护保险库的密钥,是持有在你认证器内部的 256 位对称值,相关的量子威胁在此只是 Grover 式搜索,仍留有大约 128 位的有效安全余量。
这并不能让所有风险都消失。它意味着的是:那份最重要的机密,不会躺在某个可读的服务端字段里坐等被复制。
保险库算备份吗?
它不是最后兜底的那份备份。真正可携带的备份是身份种子。
只要你持有种子,就能在 CardanoWall、命令行工具、各个 SDK、桌面应用,或任何未来遵循同一派生规则的 Label 309 软件中,重建出同一个身份。种子是唯一一件能随你走遍各处的东西。
托管的保险库帮你免去每天重新输入种子的麻烦。当你的通行密钥提供方在你的多台设备间同步通行密钥时,它也能帮你迁移到另一台已登录的设备。但保险库归属于服务层。它可以被删除、可能不可用,也会在你移除最后一把通行密钥时被一并移除。要保存的东西是种子。为什么身份种子依然重要对此有更深入的展开。
解锁时浏览器里发生了什么?
当你解锁一个身份时,浏览器需要临时访问私钥材料。这无法避免:要给一条记录签名,客户端就必须持有签名密钥;要解密一个封存文件,它就必须持有接收密钥。这些密钥是在你解锁之后,于浏览器中从种子派生而来的。
这套设计把机密挡在浏览器寻常的持久化存储之外。浏览器的本地缓存(IndexedDB)可能会保存加密的保险库密文——和服务端持有的是同一串字节——这样一来,页面刷新只需轻点一次通行密钥即可,而无需一次网络往返。它从不缓存明文种子。处于活动状态的私钥存在会话内存中,被保存在应用 UI 状态之外,并在锁定或退出登录时尽力做归零处理。
这是一套 Web 加密模型,而非硬件隔离,并且它对自身的局限坦诚相待。一个恶意的浏览器扩展、一台已被入侵的设备,或一段在解锁会话期间运行的活动恶意脚本,都能在你处于解锁状态时读取内存中的内容。严格的内容安全策略、最少的脚本,以及仅在明确操作时才解锁,都能缩小这一受攻击面,却无法将其消除。CardanoWall 消除的是服务端托管风险;它无法让一台不可信的设备变得安全。具体机制见浏览器存储与会话密钥,更宏观的原则见为什么密钥永不离开设备。
当你移除一把通行密钥时会发生什么?
保险库会在不含那个因子的情况下被重建。
当你移除一把通行密钥时,当前的保险库会被重新加密给余下的那些因子,并作为一个新的单行就地写入,替换掉旧的密文。被移除的通行密钥再也无法打开现存的这份保险库。服务甚至会在存储边界上强制保证这一点:保险库绝不会被写成「封装给某个账户已移除的凭据」的形式。
这是对当前托管保险库的真正吊销。这是服务层的控制,而非时间倒流。如果一把通行密钥在仍然有效期间被滥用——比如,在一个活动会话中被用来打开保险库并读取里面的种子——那么攻击者可能早已持有种子,事后再重新加密保险库也无法把它追回来。在这种情况下,正确的应对不是重置,而是从头开始:创建一个新身份,停用旧身份,并把新的公钥发布到人们预期能找到它的地方。
移除通行密钥会发生什么逐步讲解了确切的步骤。
如果 CardanoWall 消失了怎么办?
你已发布的证明依然能通过验证。
Label 309 证明在设计上就是可独立验证的。验证一份证明,所依赖的是公开的 Cardano 数据、记录指向公开内容寻址存储时所对应的那份存储,以及验证方自己持有的原始内容或解密材料的副本。一份有效的证明并不要求 CardanoWall 保持在线——任何人只要拿到交易引用和一个公开的 Cardano 浏览器,就能对它进行核验。
只要你保存了种子,你的身份也能存续下去。同样的这 32 字节,会在任何符合规范的工具中重建出同一个身份。
而没有种子时你会失去的,是那个身份未来的使用:生成新的签名,以及解密寄给它的封存记录。你已经发布的那些证明永远可验证,但你再也无法以那个身份行事了。这种不对称性——已发布的证明是永久的,未来的使用取决于是否持有种子——正是「没有托管方」所需付出的、刻意为之的代价。
你实际上应该怎么做?
先保存好身份种子。
把它放进一个你信得过、用来存放高价值机密的地方:一个密码管理器、一处离线的安全位置,或者任何你为「输不起」的东西所采用的那套方式。然后再添加一把通行密钥,供日常使用图方便。
对于日常用途,这一组合是一种稳健的平衡:种子保持可携带,通行密钥让日复一日的访问顺畅。对于高风险身份,再加上操作层面的控制——一把硬件安全密钥、一台专用设备,以及一个专门留给敏感工作的独立身份。
还有一点要分清楚:丢失种子(且不再剩下任何解锁因子)意味着这个身份未来无法再用,但它的证明仍然能通过验证。而被窃的种子是身份的彻底失陷,应对之策是创建一个新身份并停用旧身份——绝不是重置密码,因为根本不存在可供重置的密码。
简短版本
CardanoWall 存储的是加密的保险库密文,而非明文身份种子。
你的种子就是身份。你的通行密钥解锁加密保险库。浏览器只在你解锁之后才使用私钥,并在锁定时清除它们。服务端可以帮你发布、同步,并便捷地恢复访问——但按设计,它无法读取或重建你的身份。
保存好种子。用好通行密钥。分清两者的区别。
延伸阅读
- 你的身份就是一份种子——这份 32 字节的种子是什么,以及为什么它就是整个身份。
- 通行密钥如何保护你的身份保险库——通行密钥这把锁,以及同步密钥与硬件密钥之间的取舍。
- 浏览器存储与会话密钥——什么东西留在浏览器里、留多久,以及 Web 加密的局限。
- CardanoWall 能看到什么——服务端可见性的完整边界。
- Label 309——CardanoWall 实现的开放标准,参考代码见 github.com/cardanowall。