跳转到主要内容
Change page

以太坊上的身份验证

如果你来自传统的 Web 开发领域,你可能习惯了用户名/密码登录、OAuth 流程和会话 Cookie。以太坊上的身份验证工作方式有所不同——而且在许多方面,更加简单。

在以太坊上,用户通过使用钱包对消息进行签名来证明自己的身份。没有需要存储的密码。没有会泄露凭据的数据库。只有密码学。

它与 Web2 有何不同?

Web2以太坊
用户名 + 密码钱包地址 + 签名
服务器存储凭据用户持有私钥
会话由 Cookie / JWT 管理会话以链下钱包签名开始
“使用 Google 登录”“使用以太坊登录”
密码重置流程助记词恢复

根本性的转变在于:在 Web2 中,由中心化服务器对你进行身份验证。在以太坊上,你通过证明自己控制特定地址来验证自己的身份——并且任何人都可以独立验证这一点。

前提条件

请确保你了解:

基于钱包的身份验证工作原理

核心流程很简单:

  1. 你的去中心化应用 (dapp) 要求用户连接他们的钱包(通过梅塔马斯克 (MetaMask)、Rainbow、WalletConnect 等)
  2. 钱包共享用户的以太坊地址——这是他们的公开标识符
  3. 你的 dapp 生成一条唯一的消息(随机数或质询)
  4. 用户使用其私钥对消息进行签名(在钱包内部进行)
  5. 你的后端根据声明的地址验证签名
  6. 如果有效,则用户通过身份验证

整个过程无需输入、存储或传输任何密码。

使用以太坊登录 (EIP-4361)

EIP-4361 (在新标签页中打开) 定义了以太坊登录的标准消息格式,通常称为 SIWE(Sign-In with Ethereum,使用以太坊登录)。它用结构化、安全的标准取代了临时的消息签名。

SIWE 消息如下所示:

SIWE 的主要特点:

  • 域名绑定——消息包含域名,可防止网络钓鱼
  • 链 ID——指定签名在哪个网络上有效
  • 随机数——防止重放攻击
  • 过期时间——限制有效期的可选时间戳
  • 资源——用于范围访问的可选 URI

SIWE 库

示例:使用 siwe 进行客户端登录

示例:服务器端验证 (Node.js)

钱包连接库

在进行身份验证之前,你需要用户连接他们的钱包。这些库使这一过程变得简单:

手动验证签名

如果你不想使用 SIWE,可以直接验证签名:

重要安全注意事项

  • 始终使用随机数——防止重复使用旧签名的重放攻击
  • 包含域名——防止签名在不同网站之间有效
  • 检查过期时间——签名应具有有限的有效期
  • 尽可能使用 SIWE (EIP-4361)——它会为你处理上述所有问题
  • 切勿暴露私钥——签名在钱包内部进行;你的应用只能看到结果

会话管理

身份验证完成后,你仍然需要会话——就像 Web2 一样。常见模式包括:

  • JWT 令牌——在验证签名后颁发 JWT,用于 API 请求
  • 服务器端会话——将验证后的地址存储在会话 Cookie 中
  • 带有资源的 SIWE——定义链接到特定 URI 的范围访问令牌

与 Web2 的主要区别在于:用户的以太坊地址是其持久身份。他们可以在任何 dapp 中使用它,而无需创建新账户。

去中心化身份

以太坊身份验证是迈向自主权身份的更广泛运动的一部分。该领域的标准和项目包括:

延伸阅读