首页 > 编程语言 >python接口自动化 - 接口签名处理

python接口自动化 - 接口签名处理

时间:2022-08-18 23:34:08浏览次数:57  
标签:加密 string python 接口 sign 签名 Sign data

前言:

服务端与客户端进行http通讯时,为了防止被爬虫,数据安全性等,传参数的时候,不会明文的传输,先对接口加密,返回的数据也加密返回。

常见的是:

  • 引入 sign 签名
  • 常见的加密方案有AES加密,RSA加密,MD5加密等。

由于引入签名sign请求头,我们在测APP接口的时候,不填签名数据的话,都会被服务端加密签名校验所拦截,这对我们测接口造成了极大的困扰。也就是说,没有处理好签名,就不能进行下一步。

鉴权失败:

请求加密:

响应加密:


解决方案:

  • 让开发在测试环境关闭签名验证(一杯奶茶试试,但是基本开发也不会这样搞,测试环境关闭签名,有可能上线部署忘记打开签名,造成极大影响);
  • 通过抓包把请求的请求头和请求参数抓下来,通过postman或者jmeter测试(每次抓包,参数都是固定,但是签名随着请求参数变化而变化,每请求一次就就要抓包一次,也难搞。有时候页面没出来,包也抓不了);
  • 询问开发具体的加密过程,复写一套加密算法,自己生成加密数据(过程有可能比较复杂,但是如果你跟开发关系好就不复杂,或者你直接看开发代码,加密,解密算法自己整一套);

但是大部分时候问题往往会往最困难的方向走


以下的 sign 签名处理的例子:
import hashlib
import base64
key = '12345678900'


class Sign:
    @classmethod
    def get_sign(cls, data):

        # 不改变传入的data=>直接对字典进行复制
        data = data.copy()
        # 首先判断字典是否空,为空直接加密
        if not data:
            string = ''
        else:
            # 非空字典,过滤value为空和嵌套字典、列表
            for k, v in list(data.items()):
                if isinstance(v,str):
                    v = v.replace(" ", "").replace("\n", "")
                    data[k] = v
                if v == ''or v is None or isinstance(v,(dict,list)):
                    data.pop(k)

            # 对字典进行ASCII码排序
            new_list = sorted(data.items())
            alist = ['&' + str(i[0]) + '=' + str(i[1]) for i in new_list]
            string = ''.join(alist)
        return {"X-Sign": cls.encry(string)}

    @classmethod
    def encry(cls, string):
        """
        加密算法
        :param string: 要加密的字符串
        :return: 字符串
        """
        if string:
            sign = string[1:] + '&key=' + key
        else:
            sign = 'key=' + key
        m = hashlib.md5()
        m.update(sign.encode("utf8"))
        encodeStr = m.hexdigest()
        base_code = base64.b64encode(encodeStr.encode('utf-8'))
        return base_code.decode()


if __name__ == '__main__':
    body = {"X-Sign": ""}
    sign_data = Sign.get_sign(body)
    print(sign_data)



# 结果
# {'X-Sign': 'OTg2ZmUxYmUwYWNlY2QyODYyOTNiNzA2NGMxYzUxZjE='}



api集成

你可以将生成加密数据做成一个api提供给小伙伴使用,传入待加密的请求报文,返回加密数据,其他同学复制粘贴加密数据到请求头,即可完成接口测试。


jmeter集成

因为jmeter里面的beanshell用的是Java语法,可以直接喊开发(Java后端或者Android开发)直接帮你打个jar包,直接调用即可(一杯奶茶就好了,不行就两杯。)

import com.xxx.xxxx.Sign;
String SamplerData=prev.getSamplerData();
String signData = Sign.getSign(SamplerData);
log.info("签名数据是"+signData);

标签:加密,string,python,接口,sign,签名,Sign,data
From: https://www.cnblogs.com/wwho/p/16600538.html

相关文章

  • 学习:python 实用第三方模块
    baidu-aip人工智能算法ai:识别语音唤醒---语音识别(将语音转换为字符串)---执行指令ai.baidu.com可以访问百度AI开放平台了解相关内容例如:使用百度AI开放平台-通用文字......
  • python学习Day48
    Day48今日内容概要Navicat可视化软件多表查询练习题python操作MySQL获取命令的执行结果SQL注入问题基础用户登录SQL语句(记忆)知识点额外补充今日内容详细......
  • python 操作mysql
    importpymysqldbinfo={"host":"192.16.8.x","post":3306,"user":"root","password":"xxxx","database":"xxx"} importpymysqlclassDBope......
  • Python3项目初始化7--ORM及其项目修改
    22、DjangoORM介绍配置数据库引擎,setting操作。##CREATEDATABASEcmdb_userDEFAULTCHARACTERSETutf8mb4COLLATEutf8mb4_unicode_ci;DATABASES={'default':......
  • go 接口 实现sort排序接口 进行自定义排序
    packagemainimport("fmt""math/rand""sort")//学生结构体typeStudentstruct{NamestringIdstringAgeint}typeStudentA......
  • Python 虚拟环境管理神器:virtualenvwrapper-win for windows
    项目开发时,为了不污染全局环境,通常会使用虚拟环境隔离工具:virtualenvvirtualenvwrapper 是将所有的虚拟环境放在同一个目录下,方便管理,在使用shell配合小型开发工具就会......
  • Python-面向对象
    面向对象面向对象是一种编程思想,即按照真实世界的思维方式构建软件系统.定义类class类名[(父类)]:类体创建对象用类创建对象的过程称为实例化,是将类这个抽......
  • Python入门系列(二)语法风格
    python缩进Python使用缩进来表示代码块,例如if5>2:print("Fiveisgreaterthantwo!")如果跳过缩进,Python将给您一个错误。#下边的写法将会报错if5>2:pri......
  • python爬虫实例: 对指定城市kfc餐厅信息的爬取
    python爬虫实例:对指定城市kfc餐厅信息的爬取要求:爬取指定kfc餐厅数据kfc餐厅查询的url:http://www.kfc.com.cn/kfccda/storelist/index.aspx分析:由于餐厅信息......
  • go 接口
    golang中的接口,不需要显示的实现,只要一个变量,含有接口类型中的所有方法,那么这个变量就实现了这个接口,因此,golang中没有implemet类似的关键字如果一个变量含有多个interf......