用硬件钱包登录网站是什么原理?SLIP-0013 服务身份与签名登录拆解 图 1
用硬件钱包登录网站是什么原理?SLIP-0013 服务身份与签名登录拆解 · 图 1

钱包不只是管钱:一个被遗忘的身份用途

大多数人对钱包助记词的认知停留在”备份和恢复资产”。但在 2015 年,Trezor 的作者 Pavol Rusnak 提出了 SLIP-0013,把确定性层级(HD 钱包的种子树)反过来用作登录凭证:不需要密码,不需要短信验证码,钱包对一条挑战签名,服务端验签后直接建号或登录。它的官方状态是 Final(最终确定),类型是 Standard,创建于 2015 年 3 月 12 日。规范的核心卖点是:备份身份的方式和备份钱包是同一套——助记词在手,身份可恢复,多地点保管的做法与把助记词拆成几张卡片保管:SLIP-39 门限备份的规则怎么算讨论的门限分片可以共用同一颗种子。这解决了密码库里最脆弱的一环:登录凭证的备份。

用硬件钱包登录网站是什么原理?SLIP-0013 服务身份与签名登录拆解 图 2
用硬件钱包登录网站是什么原理?SLIP-0013 服务身份与签名登录拆解 · 图 2

服务身份:一个 URI 加一个 32 位整数

SLIP-0013 把”你在某个网站上的一次注册”抽象成”服务身份”,由两部分组成。第一部分是符合 RFC 3986 的 URI,形如 proto 冒号双斜杠,可选用户名加 at 号加主机,再跟可选端口和路径,例如 https://example.com、ssh://root@example.com:2222、ftp://public@example.com/pub。第二部分是索引,一个 32 位无符号整数,从 0 开始。索引存在的意义是:同一个 URI 下你可以派生多个密钥,比如索引 0 用于日常登录、索引 1 作为备用的第二身份,而服务端记录的就是”URI + 索引”这一对。换句话说,你的”用户名”不是邮箱而是 (URI, index) 组合。

从 URI 到派生路径:m/13 下的四段硬派生

把 URI 变成密钥的规则完全确定:先把索引按小端字节序拼在 URI 字符串前面,对拼接结果算 SHA-256;取哈希的前 128 位截断成 hash128;再按小端拆成 A、B、C、D 四个 32 位整数;给这四个数的最高位都置 1(即与 0x80000000 做按位或),使其全部成为硬化派生的分量;最后按 SLIP-0010 的规则派生路径 m/13’/A’/B’/C’/D’。这里 m/13 就是 SLIP 编号本身作为用途层,与 BIP-44 的 m/44’ 平行。规范给了完整算例:索引 0 加上 https://satoshi@bitcoin.org/login,SHA-256 得到 d0e2389d…fd696db,截前 128 位拆出 A=2637750992、B=2845082444、C=3761103859、D=1858012177,D 置最高位后变 4005495825,路径即为 m/2147483661/2637750992/2845082444/3761103859/4005495825(第一层 13’ 对应 2147483661)。任何实现了 SLIP-0013 的设备对同一 (URI, index) 必然给出同一把密钥,这正是”可恢复登录身份”的由来。

挑战-应答:三个字段各防什么

登录时服务端下发一个挑战,由三段组成。第一段就是服务身份本身,例如 https://example.com 加空格加 0。第二段叫隐藏挑战,随机字节序列,最长 64 字节,不展示给用户——它防重放,一次一用。第三段叫视觉挑战,任意文本,最长 64 字节,会显示在设备屏幕上,官方建议服务端用 YYYY-MM-DD HH:MM:SS 格式的时间戳——它让用户肉眼确认”我正在为哪个请求签名”,防的是旧挑战被挪用到新会话。签名器按上面的路径算出私钥,把隐藏挑战的 SHA-256 与视觉挑战的 SHA-256 拼接后签名,用的是标准比特币消息签名格式,最后把签名连同节点公钥和地址一起返回。

服务端的三种判决

规范把服务端的处理明确列成三种:签名无效或缺失,向用户报错;签名有效且该地址或公钥第一次出现,创建用户账号;签名有效且该地址已知,登录进对应账号。也就是说注册和登录是同一个动作的两个分支,没有注册表单,也没有找回密码流程——只要钱包里的种子还在,任何支持该协议的服务都能重新验签认人。

与资产密钥的边界:为什么它能安全共存

同一颗种子既能派生资产又能派生身份,靠的是路径隔离:m/13’ 子树专用于服务身份,资产用 m/44’ 等其它用途层(各层语义可参考BIP-44钱包派生路径怎么读?),两层之下互不重叠,泄露一侧签名不会直接给出另一侧私钥。但有两点务必看清。其一,规范原文写得很直白:验签通过后如何反应是”服务运营方的选择”(It’s up to service operator),协议本身不约束服务端怎么存你的公钥、何时删号,这部分是服务条款而不是标准。其二,签名登录意味着私钥永不出设备,屏幕上出现的地址就是你的身份锚点——任何让你”把私钥粘过来登录”的界面都与本协议无关,可直接视为钓鱼。作为 2015 年的 Final 标准,SLIP-0013 的实现主要存在于 Trezor 签名身份工具链;今天 WebAuthn、passkey 承担了大部分免密码登录场景,遇到宣称”支持 SLIP-0013 登录”的服务时,先核对该服务是否公开了可独立验签的文档,再决定是否为它占用一个身份索引。