DID登陆-MetaMask

实现原理在这里插入图片描述

参考文献

One-click Login with Blockchain: A MetaMask Tutorial

以太坊接口文档

JSON RPC · ethereum/wiki Wiki

优势

  • 提高安全性:通过公钥加密证明所有权可以说比通过电子邮件/密码或第三方证明所有权更安全,因为 MetaMask将凭据存储在本地计算机上,而不是在线服务器上,这使得攻击面更小。
  • 简化的用户体验:快速登陆,无需输入或记住任何密码。
  • 增加隐私:无需电子邮件,不涉及第三方。

缺陷

  • 用户需要安装 MetaMask:如果没有 MetaMaskAPP或安装插件的浏览器,这个登录流程显然是行不通的。如果受众用户对Web3不感兴趣或者未知,他们甚至会考虑安装 MetaMask的可能性很小。
  • 后端集成工作:要将其集成到现有的复杂系统中,需要对涉及身份验证的所有业务进行一些更改:注册、数据库、身份验证路由等。因为每个帐户都将与一个或多个公共地址相关联。
  • WEB及APP端工作:要通过唤醒MetaMask软件进行消息签名并传递给后端

后端代码实现

  1. 底层实现
public static void main(String[] args) {
    //创建公私钥对
    Credentials credentials = Credentials.create(privatekey);
    //准备要签名的数据
    String message = "Hello";
    byte[] hashMsg = Hash.sha3(message.getBytes());
    //通过公钥对数据进行签名
    Sign.SignatureData signature = Sign.signMessage(hashMsg, credentials.getEcKeyPair(), false);
    //签名转字符串
    byte[] sig_data = ByteBuffer.allocate(signature.getR().length + signature.getS().length + signature.getV().length)
            .put(signature.getR())
            .put(signature.getS())
            .put(signature.getV())
            .array();
    final String hexSig = Numeric.toHexStringNoPrefix(sig_data);
    System.out.printf("签名后的字符串:%s\n", hexSig);
}
  1. 接口实现
@PostMapping("/oauthLogin/metamask")
public ResultVo metaMaskLogin(@Valid @RequestBody MetamaskLoginReq metamaskLoginReq) {
    String publicAddress = metamaskLoginReq.getPublicAddress();
    String signature = metamaskLoginReq.getSignature();
    String message = metamaskLoginReq.getMessage();

    // 地址合法性校验
    if (!WalletUtils.isValidAddress(publicAddress)) {
        // 不合法直接返回错误
        return ResultVo.fail("地址格式非法!");
    }

    // 校验签名信息
    if (!CryptoUtils.validate(signature, message, publicAddress)) {
        return ResultVo.fail("签名校验失败!");
    }
    
    //认证通过之后 开始业务处理
    return ResultVo.success();
}

成功效果:

在这里插入图片描述

失败效果:

在这里插入图片描述
在这里插入图片描述
打赏地址:jackzero.eth

Telegram:https://t.me/JackZero0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lamantin

地址:jackzero.eth

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值