钱包是新的认证层

发布: (2026年1月12日 GMT+8 04:36)
4 min read
原文: Dev.to

Source: Dev.to

引言

如果你已经在 Web2 中实现了身份验证,Web3 钱包不应该让人感到陌生。
身份验证始终围绕一个核心问题:这个用户能否证明对某个身份的控制权? Web3 并没有改变这个问题;它只是改变了谁来存储证明。

PS: 有状态(Stateful)指的是应用程序会记住过去交互中的信息(即“状态”),并利用这些上下文来处理新的请求。


Web2 身份验证概览

服务器上的身份

在 Web2 中,身份存在于你的服务器上。

典型登录流程

  1. 用户提交邮箱和密码。
  2. 后端根据存储的凭证进行验证。
  3. 发放会话或 JWT。

OAuth 流程

即使是 OAuth 也遵循相同的结构:

  1. 身份由 Google、GitHub 等第三方声明。
  2. 你的系统信任该第三方作为真实来源。

这些模型产生了三个结构性特征:

  1. 必须存储密钥
  2. 身份绑定于平台
  3. 后端负责保护和恢复

大多数 Web2 认证问题并非错误;它们是该模型的必然结果。


基于钱包的身份验证

基于钱包的认证颠倒了架构:

  • 没有密码。
  • 没有凭证数据库。
  • 没有外部身份提供者。

钱包仅仅是一对密钥:

组件角色
公钥(地址)用户标识符
私钥控制权证明

身份验证通过 签名数据 完成,而不是提交密钥。

精确流程(Web2 友好表述)

  1. 服务器 生成随机挑战(nonce)。
  2. 客户端 请求钱包对 nonce 进行签名。
  3. 服务器 使用钱包地址验证签名。
  4. 若验证通过,用户即被认证。

这就是公钥认证——与 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 密钥,而不是服务器的
以这种方式来看,基于钱包的认证不再是异类,而是身份系统的显而易见的演进。

Back to Blog

相关文章

阅读更多 »