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
}
相关推荐
xcLeigh23 分钟前
Rust入门:基础语法应用
开发语言·rust·编程·教程·基础语法
Mr.wangh29 分钟前
单例模式&阻塞队列详解
java·开发语言·单例模式·多线程·阻塞队列
nvd1137 分钟前
Lit.js 入门介绍:与 React 的对比
开发语言·javascript·react.js
张较瘦_1 小时前
[论文阅读] 软件工程 | 解决Java项目痛点:DepUpdater如何平衡依赖升级的“快”与“稳”
java·开发语言·论文阅读
峥嵘life1 小时前
Android16 更新fastboot版本解决fastbootd模式识别不到设备问题
android·学习
HalvmånEver1 小时前
Linux:基础开发工具(一)
linux·运维·服务器·开发语言·学习·进阶学习
杜子不疼.1 小时前
【C++】深入拆解二叉搜索树:从递归与非递归双视角,彻底掌握STL容器的基石
开发语言·c++
天若有情6731 小时前
从零实现轻量级C++ Web框架:SimpleHttpServer入门指南
开发语言·前端·c++·后端·mvc·web应用
weixin_456588151 小时前
JVM(java虚拟机)
java·开发语言·jvm
hygge9991 小时前
JVM 内存结构、堆细分、对象生命周期、内存模型全解析
java·开发语言·jvm·经验分享·面试