签名过程
签名生成的通用步骤如下:
- 将所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即
key1=value1&key2={k1=v1&k2=v2…}&key3=[value3,value32] &key4=[{key41=value41&key42=value42},{key41=value411&key42=value422}]…
)拼接成字符串。
注意以下重要规则:
-
参数名
ASCII
码从小到大排序(字典序) -
如果参数的值为空不参与签名;
-
参数名区分大小写;
-
验证调用返回或主动通知签名时,传送的
signType
,sign
参数不参与签名,将生成的签名与该sign值作校验。 -
如果集合参数内包含集合,那么此包含的集合也递归使用url键值对排序拼装方式。
-
对拼装后的字符串使用
SHA256
运算,得到运算后的值。 -
将运算后的值使用自己的
RSA
私钥进行签名,将签名后的值Base64编码后封装到请求报文的sign
字段中;
Python实现
# pip install pycryptodome 安装
from Crypto.Hash import SHA256
from Crypto.Signature import PKCS1_v1_5 as Sig_pk
from Crypto.PublicKey import RSA
import base64
def sign_str(parm):
"""
参数排序
"""
str_parm = ''
for p in sorted(parm):
print(p)
if p in ['sign','signType'] or not parm[p]:
continue
elif isinstance(parm[p], dict):
str_parm += str(p) + "=" + "{" + sign_str(parm[p]) + "}" + "&"
else:
str_parm += str(p) + "=" + str(parm[p]) + "&"
return str_parm[:-1]
def sign_by_private_key(sortData,private_key):
"""
ras2签名
"""
# 获取私钥
key = base64.b64decode(private_key)
rsakey = RSA.importKey(key)
# 根据sha算法处理签名内容 (此处的hash算法不一定是sha,看开发)
data = SHA256.new(sortData.encode())
# 私钥进行签名
sig_pk = Sig_pk.new(rsakey)
signer = sig_pk.sign(data)
# 将签名后的内容,转换为base64编码
result = base64.b64encode(signer)
# 签名结果转换成字符串
data = result.decode()
return data
if __name__ == '__main__':
pass
网友评论