钱包是新的认证层
发布: (2026年1月12日 GMT+8 04:36)
4 min read
原文: Dev.to
Source: Dev.to
引言
如果你已经在 Web2 中实现了身份验证,Web3 钱包不应该让人感到陌生。
身份验证始终围绕一个核心问题:这个用户能否证明对某个身份的控制权? Web3 并没有改变这个问题;它只是改变了谁来存储证明。
PS: 有状态(Stateful)指的是应用程序会记住过去交互中的信息(即“状态”),并利用这些上下文来处理新的请求。
Web2 身份验证概览
服务器上的身份
在 Web2 中,身份存在于你的服务器上。
典型登录流程
- 用户提交邮箱和密码。
- 后端根据存储的凭证进行验证。
- 发放会话或 JWT。
OAuth 流程
即使是 OAuth 也遵循相同的结构:
- 身份由 Google、GitHub 等第三方声明。
- 你的系统信任该第三方作为真实来源。
这些模型产生了三个结构性特征:
- 必须存储密钥
- 身份绑定于平台
- 后端负责保护和恢复
大多数 Web2 认证问题并非错误;它们是该模型的必然结果。
基于钱包的身份验证
基于钱包的认证颠倒了架构:
- 没有密码。
- 没有凭证数据库。
- 没有外部身份提供者。
钱包仅仅是一对密钥:
| 组件 | 角色 |
|---|---|
| 公钥(地址) | 用户标识符 |
| 私钥 | 控制权证明 |
身份验证通过 签名数据 完成,而不是提交密钥。
精确流程(Web2 友好表述)
- 服务器 生成随机挑战(nonce)。
- 客户端 请求钱包对 nonce 进行签名。
- 服务器 使用钱包地址验证签名。
- 若验证通过,用户即被认证。
这就是公钥认证——与 SSH 使用的模型相同。
示例代码(JavaScript)
// server
const nonce = generateRandomNonce();
storeNonce(address, nonce);
// client
const signature = wallet.signMessage(nonce);
// server
const isValid = verifySignature({
address,
nonce,
signature
});
if (isValid) {
authenticateUser(address);
}
没有密码比较,没有存储的密钥——只有加密验证。
去中心化认证的影响
- 用户拥有自己的身份
- 平台无法悄悄撤销访问
- 一个身份可跨多个应用使用
- 后端不再控制认证,它只负责数学验证。
限制与仍需处理的事项
虽然钱包解决了认证问题,但它们 并未 解决:
- 授权
- 用户资料管理
- 密钥丢失防护
你仍需实现:
- 角色管理
- 权限控制
- 应用层面的用户数据
钱包取代的是登录系统,而不是更广泛的应用逻辑。
结论
把钱包视作 用户的 SSH 密钥,而不是服务器的。
以这种方式来看,基于钱包的认证不再是异类,而是身份系统的显而易见的演进。