当前位置: 首页 > news >正文

Go学习第八天

签名

func (a *Account) Sign(message []byte) ([]byte, error) {hash := crypto.Keccak256Hash(message)signature, err := crypto.Sign(hash.Bytes(), a.privateKeyECDSA)if err != nil {log.Fatal(err)}signMsg := []byte(hexutil.Encode(signature))return signMsg, err
}

验签

func (a *Account) VerifySign(signatureHex, message string) (bool, error) {// 签名 Hex 转 Bytessignature, err := hexutil.Decode(signatureHex)if err != nil {return false, errors.New("签名后的数据解析异常")}// msg 转 hashnewHash := crypto.Keccak256Hash([]byte(message))// 由于前端工具差异, 可能需要重新 Hash//var newHash []byteif signature[64] > 30 {signature[64] -= 31//newHash = signHash(hash.Bytes())} else {signature[64] -= 27//newHash = hash.Bytes()}sigPublicKeyECDSA, err := crypto.SigToPub(newHash.Bytes(), signature)if err != nil {return false, errors.New("签名解出公钥椭圆曲线异常")}// 一个重要的问题是我们必须首先删除signture的最后一个字节,因为它是ECDSA恢复ID,不能包含它。sigPublicKeyBytes := crypto.FromECDSAPub(sigPublicKeyECDSA)signatureNoRecoverID := signature[:len(signature)-1]recoveredAddr := crypto.PubkeyToAddress(*sigPublicKeyECDSA)if string(a.PublicKey()) != recoveredAddr.Hex() {return false, errors.New("签名解出公钥异常")}// 该函数接收原始数据的签名,哈希值和字节格式的公钥。 它返回一个布尔值,如果公钥与签名的签名者匹配,则为true。verified := crypto.VerifySignature(sigPublicKeyBytes, newHash.Bytes(), signatureNoRecoverID)if !verified {return false, errors.New("验签失败")}return verified, nil
}
http://www.lryc.cn/news/116445.html

相关文章:

  • 算法练习--数值相关
  • RobotFramework的安装过程及应用举例
  • WebGL系列教程:WebGL基础知识
  • 数据的逻辑结构和存储结构
  • 观察者模式(C++)
  • Web安全——Burp Suite基础上
  • 面试题更新之-this指向问题
  • 商品推荐系统浅析 | 京东云技术团队
  • 【力扣每日一题】2023.8.8 任意子数组和的绝对值的最大值
  • SpringBoot Web开发静态资源处理
  • Dockerfile定制Tomcat镜像
  • 【计算机网络】概述及数据链路层
  • Java——基础语法(二)
  • 数据结构----算法--分治,快速幂
  • 【ChatGPT 指令大全】怎么使用ChatGPT写履历和通过面试
  • 微服务:从header中获取用户存入当前线程
  • C语言系列之原码、反码和补码
  • 程序框架——UI管理模块
  • MySQL 慢查询探究分析
  • wpf 项目中使用 Prism + MaterialDesign
  • 【Spring Boot】Thymeleaf模板引擎 — Thymeleaf页面布局
  • 整理mongodb文档:删
  • 篇二十三:设计模式的综合实例:构建完整项目
  • FFmpeg常见命令行(三):FFmpeg转码
  • 合宙Air724UG LuatOS-Air script lib API--scanCode
  • 2023年新手如何学剪辑视频 想学视频剪辑如何入门
  • C++的auto究竟是何方神圣
  • 网络安全【黑客】面试题汇总
  • docker菜谱大全
  • git: git checkout命令