HD 树只长”公私钥对”,对称密钥怎么办
BIP-32 和 SLIP-0010 规定了从主种子派生公私钥对的层级方法,覆盖 secp256k1、NIST P-256、ed25519 三种曲线,这条公钥体系如何在账户层展开可看BIP-44钱包派生路径怎么读?。但密码加密、元数据加密需要的是对称密钥——不需要公钥,也不该碰椭圆曲线。2019 年 6 月,Kozlik 等三位 Trezor 工程师发布 SLIP-0021(状态 Final),给对称密钥补上了同一套”种子在手、处处复现”的层级框架。动机部分点名叫了 SLIP-0011 的老路:先用 BIP-32 派一把 secp256k1 私钥、再从私钥拧出对称密钥——BIP-32 并非为此设计,实现还被迫携带曲线运算。SLIP-0021 的替代干净得多:全程只有 HMAC。

主节点:一句 HMAC 定根
设 S 为主密钥字节串,可以是 BIP-0039 的 512 位二进制种子,也可以是把助记词拆成几张卡片保管:SLIP-39 门限备份的规则怎么算讲的分片备份重组出的主密钥。主节点 m 定义为:对 S 做 HMAC-SHA512,密钥参数取固定字符串 Symmetric key seed。用曲线名当盐是 BIP-32 的招法,这里换成用途名,目的是域分离——让对称密钥树与任何曲线密钥树从根上就走不同的哈希路径,同一颗种子派生的两套体系互不可推导。
子节点:标签代替下标
对称密钥树不用 m/0/1 这样的数字下标,而是给每个子节点一个可变长字节串标签。递推公式两条:ChildNode(N, label) 等于以 N 的前 32 字节为 HMAC-SHA512 密钥、以 0x00 拼 label 为消息的摘要;节点对应的密钥取节点数据的后 32 字节,即 Key(N)=N[32:64]。注意每条边的 HMAC 消息都以单个 0x00 字节开头——这个前缀把”哈希树派生”和”纯标签哈希”两类用法在域上分开,防止标签恰好撞上某种内部哈希结构时产生歧义。标签若用整数,规范建议以最少的 ASCII 十进制字符编码。最关键的一条纪律是根下的第一层标签必须声明用途,且要足够独特以避免应用间碰撞——官方例子是 BIP-9999、SLIP-9999 这类标准号字符串,或 FIDO2 Trezor Credential ID 这样带产品前缀的名称。每个节点固定输出 256 位对称密钥,直接可用于 AES-256 或 ChaCha20-Poly1305。
官方测试向量复算
规范给出完整算例。种子 S 取助记词 all 重复十二次、空口令得到的 512 位二进制种子(hex 为 c76c4ac4…6cd02ac8)。按上述规则:根节点密钥 Key(m) = dbf12b44133eaab506a740f6565cc117228cbf1dd70635cfa8ddfdc9af734756;套一层标签后的 Key(m/”SLIP-0021”) = 1d065e3ac1bbe5c7fad32cf2305f7d709dc070d672044a19e610c77cdf33de0d。任何实现只要这两行对得上,就说明 HMAC 顺序、0x00 前缀和切片方向没写反。顺带说明:这条 all all…种子是文档级测试向量,不是任何真实用户的助记词。
它支撑了谁:SLIP-0015/0016 的地基
密码管理(SLIP-0016)和交易元数据加密(SLIP-0015)都需要”从设备确定性派生一个稳定的对称密钥”,SLIP-0021 就是这类需求的通用底座:同一种子在任何设备上重放同一标签链,得到同一把加密钥匙,恢复助记词即恢复全部加密历史。工程上的三条推论值得记住。第一,标签是秘密的一部分:用 SLIP-0021 做加密时,标签字符串和密钥强度等价,丢了 m/”项目名” 这一层,密文与废纸同级,因此标签要么进备份要么写死在应用里。第二,标签命名规范不是礼貌而是防撞锁:所有从同一颗种子出发的应用共用一棵树,人人都叫 “notes” 的两个应用必然在根下撞车,这也是官方要求首层标签自带用途前缀的原因。第三,对称树与曲线树各走各的盐,“能推出对称密钥”不等于”能推出任何地址私钥”,反之亦然;审计某个派生用途的泄露面时,先看盐字符串,再看路径用途层,两步就能判断爆炸半径。
动手复算一次的最小路径
想亲手验证理解,不需要任何钱包软件:取任意一颗你自己生成的 BIP-39 测试种子(切勿用真实资产助记词做实验),用任意语言的标准库实现两步 HMAC 即可——先算 HMAC-SHA512,密钥参数填 ASCII 的 Symmetric key seed,消息填 64 字节二进制种子;再把返回值的后 32 字节打印成十六进制,应与规范例子的 Key(m) 结构一致(同种子时逐字符相同)。然后拼 0x00 加标签 SLIP-0021 重放子节点公式,比对 Key(m/”SLIP-0021”)。全部运算不超过二十行代码,没有任何椭圆曲线调用——这正是规范动机部分想证明的事:对称密钥派生本不必捆绑 secp256k1 运算。复算的另一个收益是暴露实现差异:个别老库把 HMAC 的密钥参数与消息参数写反、或把节点数据前 32 字节误当密钥(正确是后 32 字节),对照向量能当场抓住这类静默错误,而这类 bug 在真实资金路径上表现为”恢复后地址全错”级别的事故。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。