web3 的身份验证之以太坊签名消息

简介: 如果参与过以太坊 DApp 相关的开发,可能遇到过要求签名一条消息或一条数据以验证自己(以及哈希地址)。本文将讨论以太坊签名数据的基础知识。

如果参与过以太坊 DApp 相关的开发,可能遇到过要求签名一条消息或一条数据以验证自己(以及哈希地址)。本文将讨论以太坊签名数据的基础知识。

工作原理

在最高级别,签名消息是一种验证以太坊区块链上拥有特定哈希地址的方法。签名消息有 5 个基本要素:

  • 一个用户地址(也称为账户地址)
  • 私钥(这些只有哈希所有者知道或可以生成,通常在用户界面和密码后面,如 MetaMask 一样)
  • 公钥(可以从帐户派生,但仅在签名消息或交易时)
  • 签名消息内容
  • 数学计算

所以现在来看看这些元素是如何协同工作的,假如有一个 DApp 或 web3 网站,并且想要验证用户是否拥有某个地址,此时只知道用户的帐户。所以提供一条消息,用户对其进行签名 signature (通常通过点击 MetaMask 中的按钮),在幕后签名 signature 使用消息、私钥和公钥以及一些数学计算。

要验证签名,可以使用一些数学运算以及消息,并且应该知道公钥,而公钥一般是哈希地址地址,如何确保安全,答案是加密/数学原酸,如果没有私钥,将无法从消息中获得与公钥相等的验证,从而证明所有权。当然这一切都不需要自己去实现,有相应的脚本库来支持,如web3.js。通俗来说就是通过 MetaMask 对一条消息进行签名获得一个签名串,在后台对签名串进行解密获得一个地址,这个地址如果与用户的钱包地址一致,就说明其拥有这个地址所有权。

虽然可以通过解锁哈希地址来登录 DApp,但在以太坊中签名消息是一种肯定的同意行为,考虑任何需要用户许可但不需要直接与以太坊的 EVM 交互或与 ETH 进行交易的事情,因此没有 gas 费用(至少对于简单的消息),当然它可以作为更严格的验证,即使用钱包登录的人实际上拥有哈希地址/地址。

如何实现

通常用于实现的方式有签名一条固定的消息或者随机字符串等等,如果是随机字符串,前端通过接口获取随机字符串,然后对其随机字符串进行签名,将签名后的字符串和地址作为参数提交给后台去进行验证。下面是一般的UI效果:

image.png

下面是通过 web3.js 实现的方法:

ethereum
    .request({
        method: "personal_sign",
        params: [message, address],
    })
    .then((signature) => {
        // 这里将签名串 signature 和地址通过接口发送到后台服务验证
    })
    .catch((err) => {
        // 异常
    });

通常签名后的字符串如下:

image.png

对于后端的验证,验证使用的依赖库是 ethers ,代码如下:

/**
 * 验证签名及地址
 * @param {*} message 签名消息
 * @param {*} signerAddress 签名地址即用户钱包地址
 * @param {*} signature 签名后的字符串
 * @returns
 */
const verifyMessage = async (message, signerAddress, signature) => {
    const recoveredAddress = ethers.utils.verifyMessage(message, signature);
    return recoveredAddress === signerAddress;
};

总结

对于 DApp 或者 Web3 的开发,设计的用户验证通常的机制就是通过签名消息来实现。


相关文章
|
3月前
|
存储 JSON 数据安全/隐私保护
"FastAPI身份验证与授权的奥秘:如何用Python打造坚不可摧的Web应用,让你的项目一鸣惊人?"
【8月更文挑战第31天】在现代Web开发中,保证应用安全性至关重要,FastAPI作为高性能Python框架,提供了多种身份验证与授权方式,包括HTTP基础认证、OAuth2及JWT。本文将对比这些机制并附上示例代码,展示如何使用HTTP基础认证、OAuth2协议以及JWT进行用户身份验证,确保只有合法用户才能访问受保护资源。通过具体示例,读者可以了解如何在FastAPI项目中实施这些安全措施。
132 1
|
3月前
|
JavaScript 安全 前端开发
Node.js身份验证全攻略:策略与实践,打造坚不可摧的Web应用安全防线!
【8月更文挑战第22天】Node.js作为强大的服务器端JavaScript平台,对于构建高效网络应用至关重要。本文探讨其身份验证策略,涵盖从基于token至复杂的OAuth 2.0及JWT。Passport.js作为认证中间件,支持本地账号验证及第三方服务如Google、Facebook登录。同时介绍JWT轻量级验证机制,确保数据安全传输。开发者可根据应用需求选择合适方案,注重安全性以保护用户数据。
66 1
|
3月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
3月前
|
存储 安全 测试技术
Web2py中的身份验证与授权之谜:如何让你的Web应用飞起来?
【8月更文挑战第31天】在Web开发中,确保应用安全性至关重要,Web2py作为Python Web框架,提供了强大的身份验证与授权功能。本文探讨了Web2py的身份验证(包括表单验证、密码加密及会话管理)与授权(涵盖角色权限、URL过滤及用户组管理)。通过示例代码展示了用户模型定义、角色关系设置及登录流程处理等关键步骤。合理利用这些功能并结合最佳实践如使用内置验证、灵活控制访问权限及编写测试,可帮助开发者高效构建安全稳定的应用程序。
17 0
|
6月前
|
JSON 安全 API
【专栏】四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥
【4月更文挑战第28天】本文探讨了四种REST API身份验证方法:基本认证、OAuth、JSON Web Token(JWT)和API密钥。基本认证简单但不安全;OAuth适用于授权第三方应用;JWT提供安全的身份验证信息传递;API密钥适合内部使用。选择方法时需平衡安全性、用户体验和开发复杂性。
781 0
|
开发框架 JavaScript 前端开发
【web3实践 | 以太坊开发框架Truffle使用】
【web3实践 | 以太坊开发框架Truffle使用】
130 0
|
区块链 开发工具 数据安全/隐私保护
【Web3新手知识】了解 Wei 和 Gwei:以太坊最小面额解释
在以太坊世界中,Wei 是一个关键概念,它是这个区块链网络中最小的以太单位。随着加密货币的普及,理解各种面值变得至关重要。
415 0
|
存储 前端开发 JavaScript
Web 身份验证:Cookie 与 Token | 8月更文挑战
应用开发一般都少不了身份验证,而身份验证机制的稳定性对所有应用程序都变得至关重要。具体选择何种方式进行身份验证可以根据项目及团队情况来衡量,在决定之前需要先理解WEB身份验证常见的两种方式:基于 Cookie 的身份验证和基于令牌(Token)的身份验证。
422 0
Web 身份验证:Cookie 与 Token | 8月更文挑战
|
存储 JSON 安全
探索JSON Web Token(JWT):现代身份验证和授权的利器
在现代Web应用中,用户身份验证和授权是保护数据和资源安全的重要环节。JSON Web Token(JWT)作为一种轻量级的身份验证和授权机制,为我们提供了一种安全且高效的方式来传递信息。本文将深入探讨JWT的基本概念、结构,以及如何在应用中实现安全的身份验证和授权。
268 0
|
Web App开发 存储 算法
Web身份验证(WebAuthn)(下)
Web身份验证(WebAuthn)(下)
下一篇
无影云桌面