登录消息到底让你签了什么:CAIP-122 的 SIWx 数据模型逐项拆 图 1
登录消息到底让你签了什么:CAIP-122 的 SIWx 数据模型逐项拆 · 图 1

一段英文文本,为什么值得单独立标准

用钱包登录网站时,你多半签过这样一段话:「某站点 wants you to sign in with your account」,下面跟着地址、URI、Version、Nonce、时间戳。它是 Sign in With Ethereum(EIP-4361)定下的格式,只服务以太坊生态。编号 122 的链无关协议(CAIP-122)做的事是把这套格式抽象成任何链都能套用的数据模型,规范自己说明:EIP-4361 此后是这份规范的一种具体实现,任何能用 CAIP-2 与 CAIP-10 表达的命名空间都可以接入。写作时该提案处于 Review 状态。

登录消息到底让你签了什么:CAIP-122 的 SIWx 数据模型逐项拆 图 2
登录消息到底让你签了什么:CAIP-122 的 SIWx 数据模型逐项拆 · 图 2

字段表:七个必填,七个可选

规范要求模型必须包含以下字段。必填一列:domain(发起请求的域名 authority,取自 RFC 4501)、account_address(签名地址,只写 CAIP-10 的地址段、不含链部分)、uri(登录页 URI)、version(消息版本)、chain_id(地址所在的链标识,这一条与上一条合起来就是把地址钉回某条链,原理见 CAIP-10账户ID为什么必须带链?)、signature(签名本身)、type(签名算法类型)。可选一列:statement 给人看的声明文本、不许含换行;nonce 防重放的随机令牌;issued-atexpiration-timenot-before 三个 RFC 3339 时间;request-id 系统内标识;resources 一组 URI 形式的资源清单。链标识的写法可回看 CAIP-2链标识应该怎么解析?。字段虽多,但必填项少的代价也写在规范里:可选字段越空,签出来的凭据可校验的信息越少。

命名空间要补齐什么

抽象模型不含签名算法,规范把这块下放给各命名空间:想做 SIWx 的命名空间必须交出一个签名算法(或多个),给出每种算法对应的 type 字符串,并规定「怎么把这张字段表变成待签输入」。以太坊系可以直接把字段拼成人类可读文本再走 EIP-191 个人签名;Solana 不支持明文签名,规范给的示例是同一段文本先转成原始字节,再交给 Solana 的签名算法。建议消息保持人类可读,因为「看得见」本身就是同意质量的一部分。

签之前,看这张文本的四个部位

用户视角核对四件事。第一行域名:文本开头的域名必须和你地址栏里的站点一致,且钱包有责任核对请求确实来自这个域名——这是规范「钱包实现者步骤」里的强制条款,判断依据要取自浏览器窗口这类可信数据源,这正是防「A 站借 B 站名义骗签」的核心闸门。第二看有没有 nonce 和时间字段:缺 nonce 的签名可被原样重放,缺有效期则一签永逸。第三看 statement:它是唯一的自由文本位置,写成「授权永久提币」这种话的登录请求直接拒。第四看 resources:列出的每条 URI 都是登录时一并交出的引用,不必然是数据本身,但值得知道登录被关联到了哪些东西。

边界:它管签什么,不管签完怎么连

登录签名常被误解为「等于授权了一笔转账」,这里澄清一层:它不产生链上交易、不消耗 Gas,链上看不出你登录过哪家网站——能看出的是站点自己拿到地址后做了什么。攻击者因此把心思放在骗签本身:常见剧本是把 statement 写成诱导性承诺、把 domain 换成与正规站高度相似的仿冒域名,赌你只看弹窗不看地址栏。判断顺序建议固定成三步:先核域名逐字符比对(含连字符、数字替换这类钓鱼拼法),再核 statement 有没有夹带额度或转账字样,最后看有没有 nonce 和有效期。三步都过再签,任何一步可疑就放弃——登录签名丢了地址最多带来画像,签错一条夹带授权语义的消息则可能直接触及资产。

SIWx 定义的是登录消息的数据模型和防钓鱼纪律,不定义登录之后的会话:连接管理、方法调用归会话协议一族;把这条签名再装进能力对象容器是编号 74 的 CACAO;把「连接加认证」合成一次弹窗则是编号 222 的方法(本文不重讲)。规范还给了一个容易被忽略的提醒:这份标准面向的是「自托管的替代集中身份提供商」,也就是登录凭据的存在形式是一段链上可验证的签名,而不是服务器端的密码或会话——站点侧不存你的密码,但换来的是你的地址会进入它的用户表。签与不签,本质是这两种取舍的日常版本。