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

Posted 前端码农小王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web3 的身份验证之以太坊签名消息相关的知识,希望对你有一定的参考价值。

如果参与过以太坊 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 的开发,设计的用户验证通常的机制就是通过签名消息来实现。

基于以太坊区块链的物联网/IoT设备管理论文及源码

本文介绍一个利用以太坊区块链管理物联网IoT设备的身份识别、 验证和声誉的IoT设备管理系统。该系统使用Web界面在以太坊智能合约 中注册物联网设备,并通过密码学签名消息验证Iot设备对平台的 使用权。

1、区块链物联网设备管理系统的基本概念

物联网/IoT设备的标识: 通过默克尔树(Merkle Tree)的利用,无需暴露设备的私有属性即可完成 IoT设备的注册。使用公钥(或其衍生表示)作为IoT设备的标识ID。

物联网/IoT设备的消息签名与验证: 系统中的每个消息都需要由发送端的IoT设备签名,并在接收端的IoT 设备处进行验证。

发送端IoT设备的消息签名生成:

接收端IoT设备的消息签名验证:

物联网/IoT设备的固件指纹: 通过保存IoT设备的固件哈希,可以验证设备所运行的固件是否被非法篡改。

物联网/IoT设备的信誉机制: 基于Web的信任原理,设备可以形成一个信任网络。一个IoT设备从其他 有信誉的设备得到越多的签名,该设备就越可信。

2、区块链物联网设备管理系统的整体说明

系统主要组成部分包括:实体、设备和IoT平台:

系统开发基于以下技术栈:

  • Ethereum
  • Solidity
  • Truffle Framework
  • Web3.js
  • React

项目主要目录内容说明如下:

  • contracts - Solidity智能合约
  • frontend - Web前端,基于React开发
  • simulations - IoT设备和平台仿真

系统中IoT设备的配置文件示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
    "identifier": "0xf34d4c8f79657f1086f55b817837439c303dff19",
    "metadataHash": "43af4ba721cd8c9ba432ed6aca9adb96d16f82c25ba76...",
    "firmwareHash": "b01d2af9ea9dd59dd9c8af3f1639da03c79b7ed28adaa...",
    "metadata": [
        "Olive grove",
        "45.0270,14.61685",
        "Espressif Systems",
        "00:0a:95:9d:68:16"
    ],
    "firmware": "333f14cdb0a8520199257479ba126a10bca96b229b7924085...",
    "address": "0xf34d4c8f79657f1086f55b817837439c303dff19",
    "publicKey": "d627bbb0a7c150f814a1960ebe69f0d8b4494e1033d9e72...",
    "privateKey": "48a2e48b2d178e7d1f1508f2964a89079f1f8a301ebb85a...",
    "curve": "secp256k1",
    "deviceId": 0
}

3、区块链物联网设备管理系统的主要用户界面

网络状态界面:

实体历史记录界面:

IoT设备ID管理界面:

元数据管理界面:

IoT设备固件信息维护界面:

IoT设备维护确认界面:

配置下载界面:

IoT设备列表界面:

IoT设备ID维护界面:

IoT设备历史数据查看界面:


以上是关于web3 的身份验证之以太坊签名消息的主要内容,如果未能解决你的问题,请参考以下文章

如何读取以太坊交易的数据字段

私人以太坊网络无法识别发件人帐户

web3 python 以太坊原始交易

web3.js链接以太坊并查询钱包u余额

以太坊系列 - Web3.js

Java创建以太坊web3js客户端