在支持 Stellar 账户登录的服务上点“用钱包登录”,弹出来的不是输入框,而是一笔要你签名的交易——奇怪的是,这笔交易永远不会上链。这份流程由 Stellar 的生态标准 SEP-10(Stellar Web Authentication)定义,它把“证明这个 G 开头的账户归你控制”做成了纯签名验证。本文按标准原文拆三个部分:服务器给什么、你签什么、服务器再核对什么。
一笔不能上链的挑战交易
流程从钱包向服务的认证端点发请求开始,参数带账户地址(G 开头,或 M 开头的合并账户),可选带 memo、来域(home domain)与钱包自己的 client_domain。服务返回一个 JSON,字段只该有两个:base64 编码的交易 XDR,和(推荐但可选的)网络口令。交易本身处处是“只能看不能上链”的设计:源账户设成服务方的服务器账户;序列号故意设成零,真提交到网络过不了序列号检查;第一枚操作是以你的账户为源的 Manage Data,键名是“服务域名加 auth”字样,值是一段六十四字节的随机 nonce——四十八字节的密码学随机串经 base64 编码而来。签名时那笔网络费由谁出、交易会不会进块,都不是你需要担心的:它进不了块。

时间窗与网络核对
挑战交易的时限界(timebounds)设为发出时刻起十五分钟,标准建议 900 秒上限,给签名留缓冲又防旧挑战复用。钱包在签之前应当先核对返回里的网络口令是不是自己所在的网络——主网与测试网口令不同,对应 整张表只有两个词:CAIP-28 给 Stellar 定的 pubnet 与 testnet 链标识 讲的那两种链标识;口令对不上说明服务方配错了环境,签名照签就会得到一枚在目标网络上无效的登录凭据。若请求带了 memo,标准只允许数字型 memo,且同账户不同 memo 会被视作不同身份,这与 钱包突然要你填 Memo:Stellar SEP-29 是怎么在提交前查到的 里“备注是收款资格的一部分”共同构成 Stellar 生态对 memo 的两条使用纪律。
你签什么,服务器核对什么
钱包签名前有三步标准动作:先确认自己是从服务域名的 stellar.toml 里拿到的认证端点与签名账户(服务器账户就是 TOML 里那个 G 地址,不是弹窗临时报给你的字符串);再验证这笔交易确实已经由该服务器账户签过——没签过,你就是在给一个陌生人作证;最后核对交易序列号为零,标准原文特意强调这一步是防恶意挑战的关键。签法上还有权重细节:账户有多个签名人或启用门槛时,服务器可以要求签名权重达到 medium 或 high 门槛,只拿一个低权重签名人过的登录,第三方风险由服务自己定标准。回传签名后,服务器逐条核对:时间窗内、首操作存在且源账户非空、服务器签名正确、剩余签名属于该账户签名人且权重达标、账号不存在时要求恰好一枚主密钥签名、交易序列号必须为零;带 client_domain 时还要那一操作的源账户签名,再去钱包域的 stellar.toml 里核对该域声明的签名密钥。全部通过后,服务器发一枚 JWT 会话令牌,签发者 URI 与主题字段标明哪条服务认了哪个账户,过期时长由服务器自定,同一笔挑战不应发出两枚令牌。
安全边界:签这笔在承诺什么
这枚签名证明的是“我此刻控制这个账户”,不是“我授权任何转账”。挑战交易序列号为零、带域名 nonce,签它不会动资产,也不构成钱包对某笔支付的批准;真正的授权发生在后续请求带着会话令牌访问资源的时候。用户侧要守的底线有两条:一是核对弹窗里的域名与你正在登录的服务一致——nonce 操作键里嵌的就是那串 home domain;二是别把签名好的挑战当成可复用的凭证随手转发,它在时间窗内对认它的服务器就是有效登录凭据。
风险提示
登录签名的泄露风险远低于私钥泄露:挑战本身不可上链,重放窗口也短。但会话令牌等同临时登录态,拿到它的应用在有效期内可以账户身份行动,权限范围以该服务的实现为准。本文为协议机制说明,不构成投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。