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

        使用场景大多数用在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 recover
        for (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

 

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。 Java开发基于区块链去中心化拍卖系统源码+项目说明.zip #### 这个分支是连接了Java后端的代码,对Mysql数据库进行了操作,如果不熟悉后端的话,可以先使用noback分支 ## 温馨提示:该项目仅适用于入门学习,功能并不复杂,谢谢理解 前置知识:solidity、truffle、JavaScript、web3.js、Java(非必须其他后端语言均可)...... 一个基于truffle搭建的拍卖系统项目,这个项目主要是基于以太坊开发拍卖系统DApp,拍卖的原理类似于eBay,所以又可以叫做“去中心化eBay”项目. 默认检测Metamask钱包插件,若有则使用MetaMask进行交互,若无则连接本地的8545端口. ## 应用架构图: ![Frame](Frame.png) 首先确保电脑已经安装**truffle、webpack、ganache-cli** ``` npm install -g [email protected] [email protected] [email protected] ``` 然后打开./app/package.json进行修改并安装相关包 ``` // 这个是我的 { "name": "app", "version": "1.0.0", "description": "", "private": true, "scripts": { "build": "webpack", "dev": "webpack-dev-server" }, "devDependencies": { "@openzeppelin/truffle-upgrades": "^1.17.0", "copy-webpack-plugin": "^5.0.5", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", "webpack-dev-server": "^3.9.0" }, "dependencies": { "@babel/core": "^7.20.12", "ipfs-http-client": "^50.1.2", "ethers": "^5.4.0", "web3": "^1.2.4" } } ``` ``` npm install ``` 还要安装IPFS,[下载链接](https://dist.ipfs.tech/#kubo),我安装的版本是 kubo_v0.18.1 启动IPFS后,打开IPFS的[UI前端](http://localhost:5001/webui),修改网关等配置文件并保存,然后重启IPFS ``` { "API": { "HTTPHeaders": { "Access-Control-Allow-Credentials": ["true"], "Access-Control-Allow-Headers": ["Authorization"], "Access-Control-Allow-Methods": ["GET","POST"], "Access-Control-Allow-Origin": ["*"], "Access-Control-Expose-Headers": ["Location"] } }, "Addresses": { ... "Gateway": "/ip4/127.0.0.1/tcp/9001", ... } ... } ``` 在启动 ganache-cli 、IPFS后,在项目根目录下使用 truffle 部署合约 ``` truffle migrations ``` 新增商品服务器时监听区块链状态,然后添加到mysql数据,我部署在我的Java服务器里了([代码地址](https://github.com/kpyaoqi/JavaServer)) 如果Java不熟悉的话,也可以替换成直接查询区块链数据,或者自己有熟悉的后端语言的话也可以用其他的语言部署 在进行服务跳转的时候,会遇到跨域问题,需要在webpack.config.js文件添加一条代理配置: ```js devServer: {
【资源说明】 基于Java开发区块链去中心化拍卖系统源码+项目说明.zip 前置知识:solidity、truffle、JavaScript、web3.js、Java(非必须其他后端语言均可)...... 一个基于truffle搭建的拍卖系统项目,这个项目主要是基于以太坊开发拍卖系统DApp,拍卖的原理类似于eBay,所以又可以叫做“去中心化eBay”项目. 默认检测Metamask钱包插件,若有则使用MetaMask进行交互,若无则连接本地的8545端口. ## 应用架构图: ![Frame](Frame.png) 首先确保电脑已经安装**truffle、webpack、ganache-cli** ``` npm install -g [email protected] [email protected] [email protected] ``` 然后打开./app/package.json进行修改并安装相关包 ``` // 这个是我的 { "name": "app", "version": "1.0.0", "description": "", "private": true, "scripts": { "build": "webpack", "dev": "webpack-dev-server" }, "devDependencies": { "@openzeppelin/truffle-upgrades": "^1.17.0", "copy-webpack-plugin": "^5.0.5", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", "webpack-dev-server": "^3.9.0" }, "dependencies": { "@babel/core": "^7.20.12", "ipfs-http-client": "^50.1.2", "ethers": "^5.4.0", "web3": "^1.2.4" } } ``` ``` npm install ``` 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值