【金融项目实战】8_接口测试 _接口加解密测试

文章目录

  • 一、接口加解密
    • [1.1 加解密说明](#1.1 加解密说明)
    • [1.2 实现分析](#1.2 实现分析)
    • [1.3 实现方式](#1.3 实现方式)
    • [1.4 实现加解密测试](#1.4 实现加解密测试)
  • 二、接口-案例
    • [2.1 未加密](#2.1 未加密)
    • [2.2 加解密应用示例](#2.2 加解密应用示例)
  • 三、加密解密标准

一、接口加解密

1.1 加解密说明

思考?工作中如果要对加解密怎么做?

yacas 复制代码
1、找开发拷贝加密和解密工具
2、确定工具如何使用(如何加密、如何解密)
3、明确请求示例(请求参数格式及使用)

1.2 实现分析

1.3 实现方式

1.4 实现加解密测试

二、接口-案例

python 复制代码
一、手机端登录接口
- 名称:登录接口
- url: http://mobile-p2p-test.itheima.net/phone/member/login
- 请求方法: post
- 参数类型:"Content-Type " : "application/x-www-form-urlencoded"
- 请求参数︰
{
"member_name": "13012345678",
"password": "test123"
}

2.1 未加密

python 复制代码
# 单接口调试不用封装

import requests

url = "http://mobile-p2p-test.itheima.net/phone/member/login"

data = {
    "member_name": "13012345678",
    "password": "test123"
}
result = requests.post(url=url, data=data)
print(result.json())

2.2 加解密应用示例

步骤:

yacas 复制代码
1、找开发拷贝加密和解密工具
2、确定工具如何使用(如何加密、如何解密)
3、明确请求示例(请求参数格式及使用)

1、加密工具-开发写的

python 复制代码
import base64
import hashlib
import json
import re
from Crypto.Cipher import AES


# 加解密工具类
class EncryptUtil:
    # 发送请求时,加密密码
    SEND_AES_KEY = ";3jm$>/p-ED^cVz_j~.KV&V)k9jn,UAH"
    # 发送请求时,签名密钥
    SEND_SIGN_KEY = "DY34fdgsWET@#$%wg#@4fgd345sg"
    # 接收数据时,解密密钥
    RECEIVE_AES_KEY = "54Ms5bkE6UEdyrRviJ0![OR]g+i79x]k"

    @staticmethod
    def padding_pkcs5(value):
        BS = AES.block_size
        return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))

    # 替换空字符
    @staticmethod
    def replace_blank(str_data):
        str_data = re.compile("\t|\r|\n").sub("", str_data)
        print("replace_blank str_data=", str_data)
        return str_data

    @staticmethod
    def aes_encrypt(key, data):
        """
        AES加密
        :param key: 密钥
        :param data: 待加密数据
        :return: 加密后数据
        """
        data = base64.encodebytes(data.encode()).decode()
        # 替换特殊字符
        data = EncryptUtil.replace_blank(data)
        print("data=", data)

        # 初始化加密器
        aes = AES.new(key.encode(), AES.MODE_ECB)

        # 加密
        padding_value = EncryptUtil.padding_pkcs5(data)
        encrypt_aes = aes.encrypt(padding_value)

        # 用base64转成字符串形式
        encrypted_text = base64.encodebytes(encrypt_aes).decode()
        return encrypted_text

    @staticmethod
    def aes_decrypt(key, data):
        """
        AES解密
        :param key: 密钥
        :param data: 待解密数据
        :return: 解密后数据
        """
        # 初始化加密器
        aes = AES.new(key.encode(), AES.MODE_ECB)
        # 优先逆向解密base64成bytes
        base64_decrypted = base64.decodebytes(data.encode())

        # 执行解密
        decrypted_bytes = base64.decodebytes(aes.decrypt(base64_decrypted))
        # 转换为字符串
        decrypted_text = str(decrypted_bytes, encoding="utf-8")

        # 把Unicode转成中文
        result = decrypted_text.encode().decode("unicode_escape")
        return result

    @staticmethod
    def md5value(data):
        print("md5value data=", data)
        md5 = hashlib.md5()
        md5.update(data.encode())
        return md5.hexdigest()

    @staticmethod
    def get_diyou(data):
        # 把字典转换为JSON字符串
        if isinstance(data, dict):
            data = json.dumps(data)
        aes_encrypt_data = EncryptUtil.aes_encrypt(EncryptUtil.SEND_AES_KEY, data)
        return EncryptUtil.replace_blank(aes_encrypt_data)

    @staticmethod
    def get_xmdy(data):
        return EncryptUtil.md5value(
            EncryptUtil.SEND_SIGN_KEY + EncryptUtil.replace_blank(data) + EncryptUtil.SEND_SIGN_KEY)

    @staticmethod
    def decrypt_data(data):
        return EncryptUtil.aes_decrypt(EncryptUtil.RECEIVE_AES_KEY, data)

def encryted_Request(url,req_data):
    # 对数据进行加密
    diyou = EncryptUtil.get_diyou(req_data)
    xmdy = EncryptUtil.get_xmdy(diyou)
    # 发送请求
    req_param = {"diyou": diyou, "xmdy": xmdy}
    response = requests.post(url, data=req_param)
    # 接收响应并解密
    diyou_data = response.json().get("diyou")
    data = EncryptUtil.decrypt_data(diyou_data)
    result = json.loads(data)
    # 返回解密后结果
    return result

if __name__ == '__main__':
    # 加密
    send_data = {}
    content = json.dumps(send_data)
    diyou = EncryptUtil.get_diyou(content)
    print("diyou=", diyou)
    xmdy = EncryptUtil.get_xmdy(diyou)
    print("xmdy=", xmdy)

2、确定工具如何使用

3、明确请求示例

4、加解密应用示例

python 复制代码
import requests

from EncryptUtil import EncryptUtil

url = "http://mobile-p2p-test.itheima.net/phone/member/login"

data = {
    "member_name": "13012345678",
    "password": "test123"
}

# 1、对请求参数form进行加密
diyou = EncryptUtil.get_diyou(data)
# 2、对加密后的数据进行签名
xmdy = EncryptUtil.get_xmdy(diyou)
# 3、调用指定格式请求参数
result = requests.post(url=url, data={"diyou": diyou, "xmdy": xmdy})
# 4、解密
diyou = result.json().get("diyou")
result = EncryptUtil.decrypt_data(diyou)
print("响应结果为:", result)

三、加密解密标准

  • 说明:加密标准常用美国联邦政府高级密码标准(AES)
  • 安装:
shell 复制代码
pip install pycryptodome==3.9.6 -i https://pypi.douban.com/simple
  • 提示:拿到工具如果报错提示缺少库,需要跟开发确定安装的依赖库。
相关推荐
少云清5 小时前
【金融项目实战】9_接口测试 _BeautifulSoup基本使用
beautifulsoup·接口测试·金融项目实战
少云清2 天前
【金融项目实战】7_接口测试 _代码实现接口测试(重点)
python·金融项目实战
少云清2 天前
【金融项目实战】6_接口测试 _Jmeter自动化脚本实现(重点)
jmeter·自动化·金融项目实战
少云清3 天前
【金融项目实战】5_接口测试 _Jmeter功能脚本实现
jmeter·金融项目实战
少云清3 天前
【金融项目实战】3_接口测试 _提取测试点和编写用例
金融项目实战·提取测试点
少云清4 天前
【金融项目实战】4_接口测试 _数据准备和清理
数据库·金融项目实战
少云清5 天前
【金融项目实战】1_接口测试 _接口测试理论
接口测试·金融项目实战
少云清5 天前
【金融项目实战】2_接口测试 _API文档分析
金融项目实战·api文档分析
少云清6 天前
【金融项目实战】4_金融项目 _测试流程
p2p·测试流程·金融项目实战