(支付接口)签名验签和请求参数加密方法

2023-10-27

当我们在测试支付接口的时候,发现每个接口需要将请求的敏感数据加密后才能请求接口,遇到这种问题怎么解决呢?

特别是当我们在写python接口自动化测试脚本的时候,这是必须要解决的问题。下面我来详细的写下这个过程:

首先,我们需要拿到商户的公钥和公司的公钥,商户有自己的私钥,私钥只要商户自己知道。加密的时候拿公司的公钥加密、签名时拿商户的私钥签名。 这样传送的数据会拿商户的公钥去验签才能通过。

其次,注意python和Java的加密算法要统一, 通常使用的是SHA1安全散列算法操作的。

下面上代码:

假设我们拿到了公钥和私钥,定义参数为:

public_key=''
private_key=''

要加密请求参数为:

reqData='{"tranAmt":"0.50","payType":"2","cardNo":"1234561121456789356","holderName":"王二三",' \
'"cardAvailableDate":"","cvv2":"","mobileNo":"18900001001","identityType":"01","identityCode":"130102196303250459","bizProtocolNo":"","payProtocolNo":"","frontUrl":"","notifyUrl":"notifyUrl.do","orderExpireTime": "","merUserId":"merUserId_'+now+'","merUserIp":"106.37.175.130","riskExpand":"","goodsInfo":"测试","subMerchantId":""}'

我们发现这段请求参数特别长,把参数定义为byte类型,方便我们在加密时使用。长字符串加密时,需要把参数分割后再进行加密。方法如下:

# 公钥加密---字符串
def rsa_long_encrypt(pub_key_str, msg):
    msg = msg.encode('utf-8')  #utf-8
    length = len(msg)
    default_length = 117
    #公钥加密
    pubobj = Cipher_pkcs1_v1_5.new(RSA.importKey(pub_key_str))
    #长度不用分段
    if length < default_length:
        return base64.b64encode(pubobj.encrypt(msg))
    #需要分段
    offset = 0
    res = []
    while length - offset > 0:
        if length - offset > default_length:
            res.append(pubobj.encrypt(msg[offset:offset+default_length]))
        else:
            res.append(pubobj.encrypt(msg[offset:]))
        offset += default_length
    byte_data = b''.join(res)

    return base64.b64encode(byte_data)
with open('公司的公钥/CompPublicKey.pem') as f:
    '''读取公钥并加密'''
    key = f.read()
    result = rsa_long_encrypt(key, reqData)
    reqEncryStr=result.decode('utf-8')

加密后需要转码才能使用,转为通用的utf-8格式。

这样数据加密就完成了。下面我们看签名:

假设我们的签名串格式顺序是这样的:

reqStr= 'version=[2.0]tranCode=[EXP12]merId=[]merOrderId=[EXP12_'+now+']submitTime=['+now+']msgCiphertext=['+reqEncryStr+']'
#私钥签名方法
def requestSign():
    key_bytes = bytes(private_key, encoding="utf-8")
    key_bytes = b64decode(key_bytes)
    key = RSA.importKey(key_bytes)
    hash_value = SHA1.new(bytes(reqStr, encoding="utf-8"))   #origin_data
    signer = PKCS1_v1_5.new(key)
    signature = signer.sign(hash_value)
    return b64encode(signature)

签名使用的是SHA1方法创建新的加密串,解码的时候才能正确解析。

接口请求参数为:

requestData = {  # 请求头参数
    "charset": "1",  # 固定  UTF-8
    "submitTime": now,  # 请求提交时间
    "signType": "1",  # 签名类型-固定RSA:1
    "merId": '11000003032',
    "tranCode": "EXP12",  # 交易代码 
    "merAttach": "",
    "version": "2.0",
    "signValue": signReqStr,  # merSignStr 生成签名- 验签- 商户签名类密文串  
    "msgCiphertext": reqEncryStr,  #  
    "merOrderId": "EXP12_" + now  #  
}
resp = requests.post(url=url, data=requestData )

这样完整的加密,到请求就完成了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(支付接口)签名验签和请求参数加密方法 的相关文章

  • C语言实现MD5/SHA1/SHA256/SHA512

    哈希函数是我们做校验时经常会用到的密码学工具 目前常用的工具有MD5 SHA1 SHA256 SHA512等 其中MD5已经被证实不安全 目前只能作为一种辅助的校验手段 而不能防篡改 下面介绍如何使用mbedTLS协议栈中的hash代码生成
  • selenium webdriver一种解决打开chrome浏览器的过程

    1 下载59或58版本的Chrome浏览器 下载地址 http www pc6 com SoftView SoftView 22726 html 2 下载对应的驱动 驱动下载地址如下 当前我使用的版本是2 32 http npm taoba
  • Windows7(x64) 安装Python3.7.0

    日期 2018年8月8日 作者 Commas 注释 本文写Windows7 x64 安装Python3 7 0 讲述了基本的安装操作 同时也介绍了一些相关的基础知识 本文若有哪些地方写的有所纰漏 还望各位看客指出 谢谢 如果您想了解更多有关
  • python3: xpath的使用

    转 本文转自 https blog csdn net qq 36148847 article details 79167267 python 具有一些比较流行的解析库 例如 lxml 使用的是 XPath 语法 是大众普遍认为的网页文本信息
  • Python3之基本数据类型总结

    日期 2019年12月15日 作者 Commas 注释 学习就是为了忘记 总结一下python3的基本数据类型相关的知识 如果您想了解更多有关Python的知识 那么请点 我的Python目录 文章目录 一 变量在内存中的存储 二 内置函数
  • 工作笔记:TrueCrypt编译记录

    工作笔记 TrueCrypt编译记录 TrueCrypt的最新版本6 2可以从官方网站上下载 我从这里下载了一个6 1的 http freedos pri ee truecrypt 在TrueCrypt官方网站上很多旧版本都没了 这里却很全
  • python高级知识之常用的魔术方法

    文章目录 1 init 魔术方法 2 new 魔术方法 3 str 魔术方法 4 del 魔术方法 5 call 魔术方法 6 len 魔术方法 7 eq 魔术方法 8 hash 魔术方法 9 getitem 魔术方法 10 setitem
  • python连接clickhouse使用方法

    前沿 clickhouse现在作为分布式存储成熟的解决方案 在python开发中经常会用到clickhouse的连接方案 下面所列一个简单的连接clickhouse的写法 正文 from clickhouse driver import C
  • 神经网络预测彩票数据

    一 人工智能深度学习神经网络在双色球彩票中的应用研究 一 https www cnblogs com zdz8207 p DeepLearning NeuralNetworks html 二 百度AI http ai baidu com p
  • Java 加解密技术系列之 SHA

    序 上一篇文章中介绍了基本的单向加密算法 MD5 也大致的说了说它实现的原理 这篇文章继续之前提到的单向加密 主要讲的是 SHA 同 MD5 一样 SHA 同样也是一个系列 它包括 SHA 1 SHA 224 SHA 256 SHA 384
  • U盾的工作原理

    你的数字证书有一对 一份在U盾里的私钥 一份在银行的公钥 其实两份银行都有 U盾的原理很类似于双向认证的TLS SSL 或者其它用到RSA的双向证书验证手段 以下步骤可能和U盾实际执行的有所区别 但本质相同 银行先给你一个 冲击 它包含了随
  • python3解决读取到的邮件中的乱码问题

    点进来看这篇文章的你 是不是有这种情况 不管用什么模块去读取邮箱中的邮件 都能看到类似 gb18030 B 1vfM4g 这样的仿佛像乱码一样的东西 你比如说这样子的 X QQ FEAT YSSoAXAEBlFn3rgysgiXLVc6JA
  • rdp协议解读

    转自 http blog csdn net jiangtao killer article details 6940346 一 前言 RDP 远程显示协议 Remote Display Protocol 简称RDP 提供了客户和服务器之间的
  • 【安全与协议】使用crypto.js进行加密详解

    JavaScript Crypto JS 前言与工具 前言 使用 Crypto JS 可以非常方便地在 JavaScript 进行 MD5 SHA1 SHA2 SHA3 RIPEMD 160 哈希散列 进行 AES DES Rabbit R
  • shell脚本中嵌入二进制文件

    最近有人问我 一个集群监控软件的安装文件特别 诡异 说脚本里有 乱码 却能执行 是怎么回事 我看了才发现这个东西原来是典型的脚本嵌套代码的模式 这里就讲讲吧 反正好久没写东西了 某些比较 拽 的单位在发布Linux软件时以一种特殊的形式发布
  • openCV无法打开USB摄像头问题

    用Python OpenCV 打开USB摄像头时 出现如下提示 意思是 媒体类型不匹配 测试源代码 cap cv2 VideoCapture 0 while cap isOpened start time time is opened fr
  • yum出现Error downloading packages错误

    yum出现Error downloading packages错误 错误表现方式 yum可以list 可以clean cache 但是无法安装 错误提示 Downloading packages Error downloading pack
  • Android常用的加密算法

    一 MD5 MD5可以说是最基本最常用的加密算法了 还依稀记得在校招面试的时候被问到过 MD5信息摘要算法 MD5 Message Digest Algorithm 算法能将任意大小 格式的文字或文件进行加密从而产生 128 bit 16
  • centos7 pip3 安装python模块包报错解决

    centos7 pip3 安装python模块包报错 bash usr local bin pip3 usr local bin python3 6 坏的解释器 没有那个文件或目录 root localhost Python pip3 in
  • 如何在 CentOS/RHEL 8 上安装 Python 3.9

    Python 是一种功能强大且广泛使用的编程语言 以其简单性 可读性和跨 Web 开发 数据科学和机器学习等各个领域的多功能性而闻名 随着 Python 3 9 的发布 开发人员可以从众多增强 优化和新功能中受益 在本教程中 我们将指导您完

随机推荐