接口加密测试,所谓crypto模块的RAS非对称加密,python的脚本实现
from Crypto import Signature
import base64
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import MD5, SHA256
def signature_body(message, rsa_path): '''使用私钥签名''' with open(rsa_path) as f: key = f.read() rsakey = RSA.importKey(key) signer = PKCS1_v1_5.new(rsakey) data = datadeal(message) digest = SHA256.new() digest.update(data.encode()) sign = signer.sign(digest) signature = base64.b64encode(sign).decode() # print('签名生成',signature) return signature
参数解释:
signature_body()是接口参数加密的方法,需要传两个参数
message:请求体参数,字典格式
ras_path:私钥路径
处理之后的签名是str 类型
datadeal( )是处理数据的方法,各人面临业务的需求不同,所以自己写就行了,以下是我的业务结构:
def datadeal(r): # 键的列表 sr = sorted(r) pre_d = [] for j in sr: if type(r[j]) == dict: # print('继续追踪', j) c = datatrack(r[j]) pre_d.append(j + '=' + c) else: pre_d.append('%s=%s' % (j, r[j])) newpred = '&'.join(pre_d) # print('数据处理格式',newpred) return newpred # return bytes(newpred,encoding='utf-8') def datatrack(r={}): p = [] r1 = sorted(r) for i in r1: if type(r[i]) != dict: p.append(i + ':' + r[i]) else: c = datatrack(r[i]) p.append(i + ":" + c) p1 = ' '.join(p) conrdi = "map[" + p1 + "]" return conrdi
坑:
以上是我在site-package 里只找到的Crypto库文件,但是我在终端里查找到crypto和Crypto,两个首字母大小写不一致的版本信息。
所以大家在安装pip install crypto 之后,import crypto 有可能是个空的库,这时注意下site-package里把crypto改成Crypto,首页母改为大写
正确的引用是这样