使用场景大多数用在DAPP中调用中心化数据或者操作某些中心化功能的时候通过DAPP调用MetaMask钱包对数据进行签名传递给后台,后台验证签名数据是否是否当前用户钱包地址签名的数据实现鉴权。

一、DAPP端用Web3签名数据

注:不同的web3版本签名代码有点差异

1、0.26版本签名 web3.personal.sign

//参数1:要签名的数据
//参数2:签名的钱包地址
web3.personal.sign(web3.fromUtf8("Hello Dapp"), "0x40141cF4756A72DF8D8f81c1E0c2ad403C127b9E",(err, res) => {console.log("签名后的数据:",res)//0x53ea88d24f4ef8cdcc4bcc843912510b065cd6014c453ff61316c4cd75162f0a38f83a2103da028fb8e5181292ba194b0c8aa21a9ddacdf6783ebfa608889d121c})//web3.eth.sign此签名方法MetaMask会提示未来版本会被移除

2、1.0版本签名  web3.eth.personal.sign

3、唤醒MetaMask钱包签名数据

签名后数据为:0x53ea88d24f4ef8cdcc4bcc843912510b065cd6014c453ff61316c4cd75162f0a38f83a2103da028fb8e5181292ba194b0c8aa21a9ddacdf6783ebfa608889d121c

二、Java端使用Web3J校验数据

1、正常校验 true

 2、改变下钱包地址在次校验 false

三、后端源码-来源于github上的源码

1、web3j包

    <dependency><groupId>org.web3j</groupId><artifactId>core</artifactId><version>3.6.0</version></dependency>

2、校验源码 

package zh.block.manage.common.utils;import org.web3j.crypto.*;
import org.web3j.utils.Numeric;
import org.web3j.crypto.Sign.SignatureData;import java.math.BigInteger;
import java.util.Arrays;/*** 以太坊签名消息校验工具*/
public class MetaMaskUtil {/*** 以太坊自定义的签名消息都以以下字符开头* 参考 eth_sign in https://github.com/ethereum/wiki/wiki/JSON-RPC*/public static final String PERSONAL_MESSAGE_PREFIX = "\u0019Ethereum Signed Message:\n";public static void main(String[] args) {//签名后的数据String signature="0x53ea88d24f4ef8cdcc4bcc843912510b065cd6014c453ff61316c4cd75162f0a38f83a2103da028fb8e5181292ba194b0c8aa21a9ddacdf6783ebfa608889d121c";//签名原文String message="Hello Dapp";//签名的钱包地址String address="0xc290436b3da897115493a1547B52783c50f0Bef3";Boolean result = validate(signature,message,address);System.out.println(result);}/*** 对签名消息,原始消息,账号地址三项信息进行认证,判断签名是否有效* @param signature* @param message* @param address* @return*/public static boolean validate(String signature, String message, String address) {//参考 eth_sign in https://github.com/ethereum/wiki/wiki/JSON-RPC// eth_sign// The sign method calculates an Ethereum specific signature with://    sign(keccak256("\x19Ethereum Signed Message:\n" + len(message) + message))).//// By adding a prefix to the message makes the calculated signature recognisable as an Ethereum specific signature.// This prevents misuse where a malicious DApp can sign arbitrary data (e.g. transaction) and use the signature to// impersonate the victim.String prefix = PERSONAL_MESSAGE_PREFIX + message.length();byte[] msgHash = Hash.sha3((prefix + message).getBytes());byte[] signatureBytes = Numeric.hexStringToByteArray(signature);byte v = signatureBytes[64];if (v < 27) {v += 27;}SignatureData sd = new SignatureData(v,Arrays.copyOfRange(signatureBytes, 0, 32),Arrays.copyOfRange(signatureBytes, 32, 64));String addressRecovered = null;boolean match = false;// Iterate for each possible key to recoverfor (int i = 0; i < 4; i++) {BigInteger publicKey = Sign.recoverFromSignature((byte) i,new ECDSASignature(new BigInteger(1, sd.getR()), new BigInteger(1, sd.getS())),msgHash);if (publicKey != null) {addressRecovered = "0x" + Keys.getAddress(publicKey);if (addressRecovered.equals(address)) {match = true;break;}}}return match;}
}

多链钱包充提系统

学如逆水行舟,不进则退。心似平原跑马,易放难收。【区块链】【系统/网络/运维】【云计算/大数据】【数据库】【移动开发】【后端开发】【游戏开发】【UI设计】【微服务】【爬虫】【Java】【Go】【C++】【PHP】【Python】【Android/IOS】【HTML/CSS】【JavaScript】【Node】【VUE】【ReactNaive】。。。

欢迎各位大神萌新一起专研分享各行各业技术!

Chain区块链开发社区:593674370

DAPP开发中Web3唤醒MetaMask签名数据+Java校验签名实现去中心化和中心化用户数据的鉴权相关推荐

  1. 日常开发中的一些js处理数据的方法,包括对数据的过滤,以及对数据的验证

    目录 手机号码隐藏中间4位 保留两位小数 每三位逗号隔开,后面补两位小数,多用于金额数字 银行尾号四位数 数字金额转换为大写人民币汉字的方法 获取Url携带的地址参数 金额以元和万元为单位 隐藏证件号 ...

  2. ado.net mysql 批量插入_[Dapper].NET/C#程序开发中使用Dapper批量插入数据集合的方法应该如何实现?...

    问题描述 使用Dapper如何向数据库中批量插入数据或者说使用Dapper如何插入一个集合(List),在没有使用Dapper(使用Ado.net)的情况下,我们通常的实现方式如下: try { co ...

  3. 开发中最基本的对数据的增删改查SQL

    1.增加 insert   into   [表名] (列名) values(列值); 2.删除 delect  from  [表名]   [where<删除条件>] 3.修改 update ...

  4. java对日开发中常用词汇(一) / java対日ソフトウェア开発中よく使える単語 (不定时更新)

    日语 (英语对照) 中文含义 バックエンド(backend) 后端,后台 フロントエンド(frontend) 前端,前台 プロセス(process) 运行,执行,处理 プログラム(program) 项 ...

  5. PythonStock(38)全栈股票系统:Python全栈股票系统,使用vue进行前端界面开发,修改接口可以展示股票数据,持续开发中。

    目录 前言 0,关于Python全栈股票系统2.0,github,5.8K星星 1,Python全栈股票系统,更改使用elementUI开发 2,使用vue-element-admin,进行开发 3, ...

  6. Dapp开发教程三 Asch Dapp Mini DAO

    前边两篇教程可以称之为热身,从这里开始,进入正题. 这一次,我们要正式创建新的交易类型或者智能合约了. 1 创建合约 首先要进入dapp所在目录 cd dapps/<dapp id>/ 然 ...

  7. 从零开始学区块链之dapp开发(2)测试环境搭建

    在前面的文章中已经从整体给大家介绍了dapp的架构,这一篇主要写一下DApp开发中的测试环境的搭建. 一.主要目标 这次主要完成2个目标 ganache 的安装和介绍 MetaMask的安装和介绍 二 ...

  8. Android 开发中的观察者模式应用实例

    前言 最近在遇到了 Android 的开发中常用到的设计模式之观察者模式,观察者模式,所谓的模式就是一种设计思想,可以按照某种模式,写出更合理,简单,有效的代码.可以用在 Android 开发中,也可 ...

  9. 开发中经常使用的5种设计模式

    提到设计模式,很多人都会觉得老生常谈,有些人觉得设计模式很有必要,有些人觉得设计模式没那么重要,那么我们在工作中是否应该重视设计模式呢?我们是否应该将设计模式大量应用到我们的生产过程中呢? 如果你从未 ...

最新文章

  1. 量子技术发展的一小步:Google AI推出开源框架Cirq
  2. 上市13年,AI平台收入还能暴增131%,这家老牌AI公司正在“反杀”
  3. 计算机视觉开源库OpenCV之threshold()函数详解
  4. 一般入职体检都有哪些项目_单位常规体检一般都需要检查哪些项目?
  5. Git的remote
  6. Tomcat启动设置环境变量
  7. python中x_python中round(x,[n])的使用
  8. into outfile 生成sql脚本
  9. @keyframes关键帧动画(animation)
  10. 机器学习之线性回归的改进-岭回归
  11. Hay Points
  12. 都在夸官方文档 Vue.js 2021 年度报告出炉!
  13. 使用eclipse开发hbase程序
  14. cartographer探秘第四章之代码解析(八) --- 生成地图
  15. 二位数组的示例 go语言
  16. 使用WEPE一键安装系统
  17. php 去零取整,php取整的几种方法
  18. python opencv颜色通道_【Python+OpenCV之五】 分离颜色通道多通道图像混合
  19. 关于BTA12-600B双向可控硅应用中遇到问题的思考
  20. 简述研究生阶段如何提高自己的学习能力

热门文章

  1. 百元蓝牙耳机怎么选?学生党避雷看这里,高性价比品牌蓝牙耳机推荐
  2. element-ui 修改时间选择器样式
  3. 用webstorm搭建vue项目(亲测,绝对实用)
  4. Java根据当前时间生成对于的唯一编号(代码案例)
  5. 简单词理解单词变化规律:t、d、s、th
  6. 为什么别人的华为手机可以用那么久?原来还能这样清理垃圾!
  7. 弘辽科技:社区团购硝烟弥漫,京东对兴盛优选“出手了”
  8. 王者荣耀白晶晶皮肤1小时销量突破千万!分析网友评论我发现了原因
  9. 网上开课都用什么软件?这5款你一定要知道
  10. spring mvc 用注解和在sql中格式化时间的案例