web3 的身份验证之以太坊签名消息
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
如果参与过以太坊 DApp 相关的开发可能遇到过要求签名一条消息或一条数据以验证自己以及哈希地址。本文将讨论以太坊签名数据的基础知识。
工作原理
在最高级别签名消息是一种验证以太坊区块链上拥有特定哈希地址的方法。签名消息有 5 个基本要素
- 一个用户地址也称为账户地址
- 私钥这些只有哈希所有者知道或可以生成通常在用户界面和密码后面如 MetaMask 一样
- 公钥可以从帐户派生但仅在签名消息或交易时
- 签名消息内容
- 数学计算
所以现在来看看这些元素是如何协同工作的假如有一个 DApp 或 web3 网站并且想要验证用户是否拥有某个地址此时只知道用户的帐户。所以提供一条消息用户对其进行签名 signature
通常通过点击 MetaMask
中的按钮在幕后签名 signature
使用消息、私钥和公钥以及一些数学计算。
要验证签名可以使用一些数学运算以及消息并且应该知道公钥而公钥一般是哈希地址地址如何确保安全答案是加密/数学原酸如果没有私钥将无法从消息中获得与公钥相等的验证从而证明所有权。当然这一切都不需要自己去实现有相应的脚本库来支持如web3.js
。通俗来说就是通过 MetaMask 对一条消息进行签名获得一个签名串在后台对签名串进行解密获得一个地址这个地址如果与用户的钱包地址一致就说明其拥有这个地址所有权。
虽然可以通过解锁哈希地址来登录 DApp但在以太坊中签名消息是一种肯定的同意行为考虑任何需要用户许可但不需要直接与以太坊的 EVM 交互或与 ETH 进行交易的事情因此没有 gas 费用至少对于简单的消息当然它可以作为更严格的验证即使用钱包登录的人实际上拥有哈希地址/地址。
如何实现
通常用于实现的方式有签名一条固定的消息或者随机字符串等等如果是随机字符串前端通过接口获取随机字符串然后对其随机字符串进行签名将签名后的字符串和地址作为参数提交给后台去进行验证。下面是一般的UI效果
下面是通过 web3.js
实现的方法
ethereum.request({method: "personal_sign",params: [message, address],}).then((signature) => {// 这里将签名串 signature 和地址通过接口发送到后台服务验证}).catch((err) => {// 异常});
通常签名后的字符串如下
对于后端的验证验证使用的依赖库是 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 的开发设计的用户验证通常的机制就是通过签名消息来实现。