本期就给大家讲下,目前项目中数据签名算法的使用。我们使用的是SM2,不熟悉的可以去了解SM2的背景。
调用流程:
签名算法:SM2
功能描述:用于对各种接口行为的信息内容进行签名,并加入 timestamp 字段, 达到验证行为发起方身份、保证信息传输完整性和安全性的目的。
签名流程:
A)将请求发起方发送的所有数据根据参数名首字母 ASCII 码从小到大的顺序 排序(传入的 sign 签名参数除外),通过“&”符号拼接成一个“参数=参数 值”格式的字符串。例如:”creators=testid&time=2022-05-16”
B)将上一步得到的字符串经过一次 sha256 计算得到哈希值 SignHash
C)将上一步得到 SignHash 用机构或用户的私钥进行签名得到签名值 Sign。
举例:
假设此次行为传入的参数:creates:gx123 address: 123456 name: gx time: 2022-02-16 12:33:50
A)按序拼接上述参数得到字符串:“address=123456&creates=gx123&nam e=gx&time=2022-05-16”
B) 对上一步得到的字符串进行 sha256 计算得到 hash 值:4828dc0cdd1dc7f e3499325d1a72d4421d558c6966957f04b9262f09f2b917c5
C) 将上一步得到的 hash 值传入签名函数,通过用户或机构的私钥进行签名, 对得到的签名数据进行格式转换,最终得到 pem 格式的字符串
:MEYCIQDMyaEJa8mxqAwEJb1j4WE4iFHy8fSL3nuhiuWCJQJhUwIhAMCOLu1Uzyps 1O2YwZIIX90WeA7evBSVOOlkGpWjTDt0。
举一个创建NFT实际开发例子:
路由:/CreateNFT
功能描述:创建NFT,返回NFT信息
调用方法:POST
返回:NFT对象
参数:
参数名称 | 类型 | 说明 | 必带参数 |
---|---|---|---|
id | string | NFT的id | 是 |
create_addr | string | 创建者的地址 | 是 |
create_name | string | 创建者的名称 | 是 |
nft_name | string | NFT名称 | 是 |
nft_desc | string | NFT描述 | 是 |
nft_addr | string | NFT地址 | 是 |
nft_metadata | string | NFT元数据地址 | 是 |
nft_total | string | 发行的NFT总量 | 是 |
sign | string | 签名,用于验签 | 是 |
timestamp | string | 时间戳 | 是 |
nft_hash | string | NFT哈希值 | 是 |
逻辑:
A) 对传入的参数进行校验,判断所有参数是否非空。参数名 类型 说明 address string 钱包地址
B) 若都不非空,则验证签名信息。先将传入的时间参数与当前时间进行比较, 若差值在允许范围内则进行下一步验证。
C) 根据传入的信息构造成签名参数,对此信息进行签名(签名逻辑已在上文 阐述,此处不再赘述),通过 SM2 验证算法对传入的签名进行验证。
D) 若签名验证通过,则根据 NFT 链上地址进行链上查询,若链上不存在,则 生成 NFT 的地址,并将此地址与 NFT 其他信息进行封装,再上链。
本期就到这里,下期继续未完讲解。
同学们,兴趣是最好的老师;只争朝夕,不负韶华!加油!
参考资料:
Go语言中文文档
http://www.golang.ltd/
Go语言官方文档
https://golang.google.cn/
海伦链论坛(筹建中)
https://www.HeronChain.Com/
Golang语言情怀
ID:wwwGolangLtd
www.Golang.Ltd
游戏服务器架构丨分布式技术丨大数据丨Go语言学习