Go学习第八天

签名

java 复制代码
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
}

验签

java 复制代码
func (a *Account) VerifySign(signatureHex, message string) (bool, error) {
	// 签名 Hex 转 Bytes
	signature, err := hexutil.Decode(signatureHex)
	if err != nil {
		return false, errors.New("签名后的数据解析异常")
	}
	// msg 转 hash
	newHash := crypto.Keccak256Hash([]byte(message))

	// 由于前端工具差异, 可能需要重新 Hash
	//var newHash []byte
	if 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
}
相关推荐
小白学大数据5 分钟前
Scrapling:极简高效的 Python 智能爬虫框架
开发语言·爬虫·python·数据分析
魔法阵维护师10 分钟前
从零开发游戏需要学习的c#模块,第十一章(rpg小游戏入门,上篇,地图与移动)
学习·游戏·c#
qq_5255137511 分钟前
# 第七章 指令微调学习(四) 7.6基于指令数据对大语言模型进行微调
深度学习·学习·语言模型
天下无敌笨笨熊12 分钟前
C#常用三方库使用心得
开发语言·c#
basketball61613 分钟前
C++ 继承完全指南:从 is-a 关系到虚继承的底层真相
开发语言·c++
AIFQuant20 分钟前
Java 对接全球股票实时报价:高可用架构与异常处理
java·开发语言·websocket·金融·架构·股票api
Huangjin007_27 分钟前
【C++ STL篇(十)】深入理解 AVL 树:代码实现、旋转图解与平衡因子详解
开发语言·c++
小明同学0133 分钟前
C++后端项目:统一大模型接入 SDK(四)
服务器·开发语言·c++·计算机网络·chatgpt
Harm灬小海1 小时前
【云计算学习之路】学习Centos7系统-ROOT密码重置方法
linux·运维·服务器·学习·云计算
安妮的小熊呢1 小时前
CRMEB开源商城系统 & 标准版系统(PHP)开发规范
开发语言·javascript·php