不要再在以太坊和Metamask开发web时使用密码

基于MetaMask 插件开发 使用区块链网络需要先了解该网络的特点和使用方式,包括如何创建钱包、如何转账、如何查询交易记录等。创建钱包:需要下载并安装以太坊钱包软件,然后创建钱包地址和密码,保存好私钥和助记词。转账:需要向钱包地址中充值以太币或其他代币,然后使用钱包软件进行转账操作,填写收款人地址和转账金额等信息,确认交易并等待区块确认。查询交易记录:可以通过区块浏览器等工具查询交易记录和区块信息,了解交易状态和详情。 阅读详情

我在ConsenSys为各种客户构建了大量的概念证明,通常他们想要利用以太坊区块链来解决某些业务用例。奇怪的是,这些系统通常设计有标准的网络登录(即用户名和密码)。我总是问自己为什么我还在这样做设计,毕竟,这是今天以太网目前可以解决每个烦人的Web应用程序的一个方面。所以我决定停下脚步,设计一下这个解决方案。

JSON Web token

登录标准Web系统(和/或使用其API)的一种非常流行的方法是将密码(经过哈希的客户端)提交给认证端点并接收token作为回报。这通常称为JSON Web Token,通常在一段有限的时间内(几分钟到几天)有效。这是一个关于标准实现的很好的教程。

JSON Web Token很好,我开始认为在区块链上验证自己很容易。事实上,当你使用以太坊时,你需要不断地去改进。

如果你将以太网地址(这只是公钥的sha3哈希)视为网站上的帐户,则可以通过使用私钥对一段数据进行签名来证明你拥有该帐户,这非常容易。此数据是任意的,可以是网站API提供的任意随机字符串。因此,我们可以使用地址作为用户名并绕过密码的需要。事实上,我们甚至不需要使用区块链来做到这一点。

这是使用Express的样子:

首先,我们需要使用私钥进行椭圆曲线签名:

var ethUtil = require(‘ethereumjs-util’);  // >=5.1.1
var data = ‘i am a string’;
// Elliptic curve signature must be done on the Keccak256 Sha3 hash of a piece of data.
var message = ethUtil.toBuffer(data);    
var msgHash = ethUtil.hashPersonalMessage(message);    
var sig = ethUtil.ecsign(msgHash, privateKey);    
var serialized = ethUtil.bufferToHex(this.concatSig(sig.v, sig.r, sig.s))    
return serialized

不要过分担心这些参数是什么。这里有一些密码学,我鼓励你阅读椭圆曲线签名。比特币维基是一个不错的起点。

无论如何,一旦我们有了签名组件,我们就可以将它们与用户的地址一起打包并将其全部发送到认证端点。

POST/Authenticate

var jwt = require(‘jsonwebtoken’);
var ethUtil = require('ethereumjs-util');
function checkSig(req, res) {
  var sig = req.sig;
  var owner = req.owner;
  // Same data as before
  var data = ‘i am a string’;
  var message = ethUtil.toBuffer(data)
  var msgHash = ethUtil.hashPersonalMessage(message)
  // Get the address of whoever signed this message  
  var signature = ethUtil.toBuffer(sig)
  var sigParams = ethUtil.fromRpcSig(signature)
  var publicKey = ethUtil.ecrecover(msgHash, sigParams.v, sigParams.r, sigParams.s)
  var sender = ethUtil.publicToAddress(publicKey)
  var addr = ethUtil.bufferToHex(sender)
 
  // Determine if it is the same address as 'owner' 
  var match = false;
  if (addr == owner) { match = true; }
  if (match) {
    // If the signature matches the owner supplied, create a
    // JSON web token for the owner that expires in 24 hours.
    var token = jwt.sign({user: req.body.addr}, ‘i am another string’,  { expiresIn: “1d” });
    res.send(200, { success: 1, token: token })
  } else {
    // If the signature doesn’t match, error out
    res.send(500, { err: ‘Signature did not match.’});
  }
}

所以基本上,给定一些数据,一个地址和一个EC签名的组件,我们可以安全的证明该地址属于签署数据的人。很酷,对吧?

一旦我们对签名和地址匹配感到满意,我们就可以为该地址服务器端签署一个JSON Web token。 在这种情况下,token有效期为1天。

现在我们只需要放入一些中间件来保护任何服务或修改受保护信息的路由。

middleware/auth.js

function auth(req, res, next) {
  jwt.verify(req.body.token, ‘i am another string’, function(err, decoded) {
    if (err) { res.send(500, { error: ‘Failed to authenticate token.’}); }
    else {
      req.user = decoded.user;
      next();
    };
  });
}

app.js

// Routes
app.post(‘/UpdateData’, auth, Routes.UpdateData);
…

如果提供的Token对应于发送请求的用户,我们将继续请求路由。请注意,中间件会修改请求。我们需要引用这个新的user参数,因为我们知道它已经在我们的中间件中设置了。

POST/UpdateData

function UpdateData(req, res) {
  // Only use the user that was set in req by auth middleware!
  var user = req.user;
  updateYourData(user, req.body.data);
  ...
}

我们终于搞定它了! 你的用户已经完全登录,但不需要密码。

UI方面

用户如何在浏览器中实际签署此数据?Metamask会提供帮助!Metamask是一个整洁的chrome扩展,它将web3注入你的浏览器窗口。

mycomponent.jsx

makeSig(dispatch) {
 
 function toHex(s) {
   var hex = ‘’;
   for(var i=0;i<s.length;i++) { hex += ‘’+s.charCodeAt(i).toString(16); }
   return `0x${hex}`;
 }
 
 var data = toHex(‘i am a string’);
 web3.currentProvider.sendAsync({ id: 1, method: 'personal_sign', params: [web3.eth.accounts[0], data] },
   function(err, result) {
     let sig = result.result;
     dispatch(exchange.authenticate(sig, user))
    })
  }
}
render(){
  let { dispatch, _main: { sig } } = this.props;
  if (Object.keys(sig).length == 0) { this.makeSig(dispatch); }
  return (
   <p>I am a webpage</p>
  );
}

这将触发Metamask弹出一个窗口,要求用户对消息进行签名:

一旦调用了回调,它将调用以下操作:

authenticate(sig, user) {
  return (dispatch) => {
    fetch(`${this.api}/Authenticate`, {
      method: 'POST',
      body: JSON.stringify({ owner: user, sig: sig}),
      headers: { "Content-Type": "application/json" }
    })
    .then((res) => { return res.text(); })
    .then((body) => {
      var token = JSON.parse(body).token;
      dispatch({ type: 'SET_AUTH_TOKEN', result: token})
    })
  }
}

一旦你在reducer中保存了auth token,你就可以调用经过身份验证的端点。我们终于得到它了!

请注意,必须从签名中恢复v,r和s值。Metamask有一个签名util模块,用于显示签名的构造方式。它可以像这样解构:

var solidity_sha3 = require('solidity-sha3').default;
let hash = solidity_sha3(data);
let sig = result.result.substr(2, result.result.length);
let r = sig.substr(0, 64);
let s = sig.substr(64, 64);
let v = parseInt(sig.substr(128, 2));

其中r将被解析为0或1.另请注意,这使用solidity-sha3模块来确保此哈希算法与用作solidity本机hash方法的哈希算法相同(我们正在hash之前签名的十六进制字符串))。

生产准备

我无法强调使用JSON Web token的每个Web应用程序今天都可以轻松利用这一点。具有Metamask扩展的任何用户都可以简单地绕过登录屏幕,其安全性可能比目前用于管理登录的任何内容都要好。这意味着更少的忘记密码,更少的浪费时间和更快乐的用户群。

而且,你知道,如果你希望你的用户在没有中间人的情况下向对方(或你或使用此用户的任何其他系统上的用户)付款,或者如果你想要利用以太坊的其他百万其他功能,那么你需要也这样做。

今天开始,加入我们以太坊,去征服世界。

======================================================================

分享一些以太坊、EOS、比特币等区块链相关的交互式在线编程实战教程:

  • java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
  • python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
  • php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
  • 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
  • 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
  • C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
  • EOS教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
  • java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
  • php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
  • tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。

汇智网原创翻译,转载请标明出处。这里是原文不要再在以太坊和Metamask开发web时使用密码

区块链之以太坊合约开发工具——Metamask钱包和Remix IDE 摘要:本文介绍了以太坊开发入门工具MetaMask钱包和Remix IDE的使用方法。MetaMask作为浏览器插件钱包,可用于创建账户、管理密钥、执行交易。文章详细说明了插件安装、账户创建及测试网充值步骤。Remix IDE则提供了智能合约开发环境,通过一个计数器合约示例,展示了从编写、编译到部署(包括VM和测试网)的全流程,并解释了ABI和字节码的作用。最后简要介绍了合约函数的调用方式,橙色按钮修改状态,蓝色按钮读取状态。这两款工具为初学者提供了便捷的以太坊智能合约开发体验。 阅读详情

相关推荐

2024年 Web3开发学习路线全指南

如果你想在区块链开发上更进一步,此时你需要考虑的就会更多了,例如你可能发现链上交易的Gas费用越来越高,此时你需要考虑优化你的智能合约来降低每笔交易的Gas费用。

Luckyy_D的博客 4215

使用以太坊和 Metamask 再也不需要输入密码

我在 ConsenSys 为各种客户创建了很多概念性证明,通常他们希望利用以太坊的区块链解决一些业务问题。奇怪的是,这些系统经常被设计为具有标准的 Web 登录(即使用用户名和密码)。 之前我一直问自己为什么要这么设计,毕竟现在以太坊上可以解决输密码这件麻烦的事件。 于是我开始设计解决方案。 JWTs (JSON Web Tokens) 一个登陆标准网站或者 API 的常用规范。客户端向服务器...

跨链技术践行者 1万+

MetaMask_v3.9.5以太坊钱包管理插件使用指南

MetaMask是一种流行的浏览器扩展程序,作为以太坊钱包,它允许用户与以太坊区块链及其去中心化应用(DApps)进行交互。MetaMask不仅为用户提供了一个便捷的界面来管理他们的以太坊账户和数字资产,而且还充当了网页与以太坊网络之间的桥梁。在某些情况下,用户可能会收到一些非主流或新发行的代币,这时他们需要手动添加这些代币到MetaMask中以查看其余额。添加自定义代币步骤:打开MetaMask插件,并确保你已经连接到了相应的网络。

weixin_42594427的博客 2206

用 Web3 以太坊接口连接与操作 MetaMask 开发指南

本文用一个例子,演示了如何使用 window.ethereum 对象连接并操作 MetaMask 钱包的方法。MetaMask 是一个浏览器插件钱包,支持火狐浏览器和谷歌浏览器。插件安装完成后,window 对象中会出现一个 window.ethereum 的对象。

StevenX5 6075

MetamaskAuth:通过Metamask和Moralis对您的用户进行身份验证

MetamaskAuth 通过Metamask和Moralis对您的用户进行身份验证

metamask-vault-decrypter:CLI使用密码解密MetaMask加密的保管库

MetaMask Vault解密器 CLI使用密码解密MetaMask加密的保管库 安装 npm install -g metamask-vault-decrypter 入门 cat encrypted-vault.json | metamask-vault-decrypter --password mysecretpassword cat encrypted-vault.json | metamask-vault-decrypter --password-list passwords.csv 执照

区块链开发之Metamask使用调研

区块链开发之Metamask使用调研 支持的浏览器 ​ 链接Metamask 自动链接Metamask钱包。 代码示例 const Web3 = require("web3"); const ethEnabled = async () => { if (window.ethereum) { //获取账户地址 const account = await window.ethereum.request({method: 'eth_requestAccounts'}); c

蜀道难,难于上青天。 1万+

区块链钱包MetaMask的使用

区块链钱包MetaMask的使用

怎么通过助记词登录MetaMask和通过私钥登录

用助记词或者私钥登录metamask,已经两种方式登录的区别是什么。

qq_43917601的博客 9560

Go-zero微服务实战:从零搭建电商用户系统(含完整代码示例)

本文详细介绍了如何使用go-zero框架从零搭建电商用户系统,包含完整的微服务架构设计、核心功能实现代码示例以及性能优化策略。通过分层架构设计、JWT认证、分布式锁等关键技术,实现高并发、高可用的用户系统,适用于电商平台开发。

weixin_29275257的博客 255

Python模拟发送SOME/IP消息(Scapy模块)

SOMEIP提供服务、订阅、响应、通知等Python代码示例

liluo0815481的博客 3068

以太坊和Metamask开发web时不用再用密码

我在ConsenSys为各种客户构建了大量的概念证明,通常他们想要利用以太坊区块链来解决某些业务用例。奇怪的是,这些系统通常设计有标准的网络登录(即用户名和密码)。我总是问自己为什么我还在这样做设计,毕竟,这是今天以太网目前可以解决每个烦人的Web应用程序的一个方面。所以我决定停下脚步,设计一下这个解决方案。 JSON Web token 登录标准Web系统(和/或使用其API)的一种非常流行...

rejames的博客 770

多智能体强化学习论文——SEAC(NIPS 2020)

存在的问题&研究动机&研究思路 在稀疏奖励的环境下,多智能体的exploration存在效率不足等问题。 在IAC的基础上尝试加入重要性采样,使得每次更新智能体iii的参数时,不再仅仅使用智能体iii的数据,而是使用所有智能体的数据进行智能体iii数据的更新。 对于原始的IAC算法是on-policy的,而SEAC则是off-poligy的。 创新点 在每个智能体iii的actoriactor_iactori​和criticicritic_icritici​的更新过程中,都加入了重要性

我的AI笔记 1206

以太坊和Metamask开发web应用时不再需要密码

我在ConsenSys为各种客户构建了大量的概念证明,通常他们想要利用以太坊区块链来解决某些业务用例。奇怪的是,这些系统通常设计有标准的网络登录(即用户名和密码)。我总是问自己为什么我还在这样做设计,毕竟,这是今天以太网目前可以解决每个烦人的Web应用程序的一个方面。所以我决定停下脚步,设计一下这个解决方案。 JSON Web token...

weixin_33763244的博客 266

基于YOLOv5的人脸识别系统:从构建到应用的全流程指南

本文详细介绍了基于YOLOv5的人脸识别系统开发全流程。首先阐述了YOLOv5模型的高效性和准确性优势,随后分步骤讲解了深度学习环境配置、数据集准备(推荐WIDER FACE数据集)和模型训练方法。重点展示了如何将训练好的模型集成到Tkinter开发的GUI界面中,实现图片上传、人脸检测和结果可视化功能。文章提供完整的代码示例和飞书文档链接(密码:946m22&8),帮助开发者快速构建可交互的人脸识别系统,适用于安防、门禁等多种应用场景。通过该项目,读者可掌握YOLOv5的实际应用和界面集成技术。

FJN110的博客 169

Kafka 入门篇(一)

初识 Kafka 什么是 Kafka Kafka 的基本术语 Kafka 的特性(设计原则) Kafka 的使用场景 Kafka 的消息队列 点对点模式的消息队列 发布-订阅模式的消息队列 Kafka 系统架构 核心 API Kafka 为何如此之快 broker 端配置 broker.id port zookeeper.connect log.dirs num.recovery.threads.per.data.dir auto.create.topics.enable topic默认配置 num.par

1232

以太坊:Truffle 和 MetaMask 配合

Truffle 和 MetaMask 配合 在浏览器中与智能合约进行交互之前,请确保合约已经编译及部署,并且我们是通过客户端JavaScript中的web3与合约进行交互。 Truffle 建议使用truffle-contract库,因为它使合约的交互更容易,更健壮。 有关这些主题的更多信息,包括使用`truffle-contract`,请查看的Truffle教程:宠物商店或Tutori...

跨链技术践行者 1万+

在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统

智能建筑能效优化是现代建筑管理的重要组成部分,旨在通过智能化手段降低能源消耗、减少碳排放并提高居住舒适性。通过Simulink进行智能建筑能效优化仿真,可以验证控制策略的有效性、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个智能建筑能效优化系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的智能建筑能效优化仿真。该系统能够模拟复杂的建筑环境,验证能效优化策略的有效性,并通过优化设计提高建筑的能源利用效率和居住舒适性。

xiaoheshang_123的博客 138

快速上手login-with-metamask:3分钟实现以太坊钱包登录功能

login-with-metamask是一个专为开发者设计的开源项目,能够帮助你在3分钟内为应用集成以太坊钱包登录功能。通过简单的配置和几行代码,即可实现基于MetaMask的区块链身份验证,让用户体验安全、便捷的去中心化登录流程。 ## 🌟 为什么选择MetaMask登录? 区块链技术的普及让去中心化身份验证成为可能。MetaMask作为最流行的以太坊钱包插件,拥有超过3000万用户,支持

gitblog_01113的博客 900

广义正态分布优化算法(GNDO)详解:从理论到实践

广义正态分布优化算法(GNDO)是一种基于正态分布理论的新型元启发式优化算法。该算法通过局部开发和全局探索两种策略平衡搜索过程:局部开发利用广义平均位置和标准差进行精细搜索,而全局探索通过随机个体信息共享扩大搜索范围。GNDO具有参数少、结构简单、收敛速度快等优点,在光伏模型参数提取等工程优化问题中表现优异。算法将种群位置更新与正态分布参数调整相联系,通过自适应机制平衡探索与开发,数学分析表明其具有全局收敛性。相比传统优化算法,GNDO在探索能力和开发能力上均有优势,是高维复杂优化问题的有效解决方案。

qq_42212808的博客 137

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Web3】从MetaMask到Gas机制全解析

这篇文章介绍了Web3基础知识和工具使用,重点讲解了MetaMask钱包的工作原理和区块链核心概念。主要内容包括:1)MetaMask作为非托管钱包的功能,通过椭圆曲线算法生成私钥,确保账户唯一性和安全性;2)私钥与助记词的关系,助记词作为主密钥的重要性;3)不同区块链网络的选择与区别;4)区块链的密码学基础,包括非对称加密和电子签名机制;5)以太坊Gas费用机制和EIP-1559更新带来的费用模型变化。文章强调私钥和助记词的安全保管是区块链账户管理的核心,同时解释了去中心化身份与传统中心化账户体系的本质区

Joy T的博客 1622

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南

Web3.js是以太坊官方JavaScript库,简化了与智能合约的交互过程。本文介绍了Web3.js的核心功能与使用方法:1) 通过Web3提供者(如Infura或Metamask)连接以太坊节点,2) 使用合约地址和ABI与智能合约对话,3) 区分call和send方法调用合约函数。重点讲解了如何集成Metamask进行用户账户管理,包括检测账户变更和事务签名。该指南为开发者提供了Web3.js的基本操作框架,包括初始化、合约交互和事件处理等关键环节。

m0_46421522的博客 1132

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

探索未来登录方式:以太坊无密码签入系统结合MetaMask与PHP

探索未来登录方式:以太坊无密码签入系统结合MetaMask与PHP php-metamask-user-loginWeb3 passwordless user login with MetaMask and PHP项目地址:https://gitcode.com/gh_mirrors/ph/php-metamask-user-login 项目介绍 在密码遍地、安全困扰的时代,Web3 Passw...

gitblog_00097的博客 734

探索以太坊世界:使用Geth打造你的私人网络

公有链是开放的区块链网络,任何人都可以加入并参与网络的操作,而且所有的交易和数据都是公开透明的。它提供了完整的以太坊节点实现,可以连接到以太坊的主网(公有链)或者搭建私有链、联盟链等自定义的区块链网络。通过以上步骤,你已经成功搭建了自己的以太坊私链,并且连接了 Metamask,可以开始在私链中进行智能合约的开发和测试。祝你在以太坊开发的旅程中取得成功!安装好之后放在一个新的文件夹里,命名为geth,里面只有一个geth.exe,随后新建一个keystore文件夹,这个文件夹里面是存放新创建的账户密码的。

Huahua_1223的博客 3141
上一篇: web3j的Gradle插件
下一篇: iOS和macOS上Swift编写的EOS区块链开源框架SwiftyEOS
落叶无声9
博客等级 码龄12年 443粉丝 343原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值