阿里测试开发手把手教你「MD5加密接口」的测试,学完涨薪3k没问题

对于api接口开发人员、测试人员都需要了解加密技术,好的加密设计是可以很大程度上增加系统的安全性的,安全了必然就增加了接口的复杂性,对于我们测试,也就提升了难度。本文会以一个具体的MD5加密接口为案例,采用postman、jmeter和requests三种不同的工具进行测试,希望能够抛砖引玉,对大家解决加密接口测试问题有所帮助。

视频教程:三天搞定python接口自动化测试框架项目实战全套教程【高启强推荐】_哔哩哔哩_bilibili

一、接口加密技术

1、常见的接口加密方式

  • 基础级加密:接口参数(数据)加密
  • 进阶版加密:接口参数加密+接口时效性验证(cookie、session技术)
  • 传说版加密:参数加密+时效性验证+私钥(证数)
  • 史诗版加密:接口参数加密+时效性验证+私钥+Https(SSL安全协议技术)

2、对称加密

在加密解密过程中,使用的密钥只有一个,数据使用的发送、接收双方事先都知道加密的密钥(共享),均使用这个密钥对数据进行加密和解密。

数据加密:数据发送方将明文 (原始数据) 和 加密密钥一起经过加密处理,生成一定格式的密文进行发送。

数据解密:数据接收方收到密文后,使用加密的密钥及相同算法的逆算法对加密的密文进行解密,将使其恢复成可读明文。

 

3、非对称加密

加密过程中有两个密钥,一个称为公开密钥 (publickey),另一个称为 私有密钥 (private key),数据使用的发送(加密)、接收双方(解密)使用的是两个不同的密钥,相比对称加密,更加安全。

如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密。

如果使用私钥对数据进行加密,只有用对应的公钥才能进行解密。、

 

4、常见的加密算法

  • AES加密算法
  • DES加密算法
  • RSA加密算法(非对称加密算法)
  • Base64加密算法
  • MD5加密算法

二、百度通用翻译案例介绍

我们采用百度通用翻译接口作为案例来讲解,百度通用翻译的API文档见链接:

https://api.fanyi.baidu.com/doc/21

该接口的API文档中提供了接口调用的相关信息,如下:

翻译接口的URL地址:https://fanyi-api.baidu.com/api/trans/vip/translate

翻译接口的请求方式:get和post皆可,采用post请求时Content-Type 请指定为:application/x-www-form-urlencoded

请求参数(数据):

其中q为查询参数,采用UTF-8编码

Appid为百度开发者id,需要注册成为百度开发者才可以,在控制台可以查看。

Sign为签名,接口采用MD5加密算法进行了数字签名,将appid+查询数据+随机数+密钥组成的字符串加密为32位小写签名字符串,以保证接口的安全性。

可以通过浏览器直接输入拼接的URL地址就可以直接测试接口正确性(get方式)。

如果是post请求方式的话,就需要借助一些接口测试工具实现了,下面我们采用三种工具jmeter、postman和requests分别进行该接口的测试。

三、jmeter实现加密接口测试

Jmeter中提供了两种实现md5加密的方式,一种是函数助手,一种是前置Beanshell处理器。

要实现通用翻译接口,需要提前使用md5算法完成签名,获取sign参数。

1、前置beanshell处理器实现

Jmeter自带的就有MD5加密需要使用的到的commons-codec-1.10.jar,这个文件是在jmeter安装目录的lib下的。

第一步:在jmeter中创建测试计划,并通过浏览功能导入md5加密的jar包

第二步:实现通用翻译接口,其中签名sign需要使用${sign}进行参数化,其值在前置Beanshell处理器中进行Md5处理候获得。

第三步:在翻译接口的http请求下创建前置Beanshell处理器(java语法),将拼接的签名字符串进行md5加密,获得sign参数,如果是其他的加密方式,需要开发将加密算法打包为jar包,和第一步一样加载进来即可。

import org.apache.commons.codec.digest.DigestUtils;

String pwd = "20190630000313415apple888888IL7VipagQVFGKlo8XMIr";
pwd = DigestUtils.md5Hex(pwd);
log.info(pwd);
vars.put("sign",pwd);

第四步:添加debug调试采样器和查看结果树,运行测试计划。

查看结果树中的debug采样器中的数据,正确显示md5加密后的签名sign

查看结果数据的接口数据,正确显示通用翻译接口的翻译结果。

至此,使用jemter结合前置Beanshell处理器就实现了签名的md5加密及翻译接口功能了。

2、函数助手实现

在jmeter的函数助手功能中,提供了专门的md5加密功能,可以直接使用__MD5实现加密,设置如下图。

复制上图中的函数字符串,对通用翻译接口中的sign参数进行参数化即可。

运行测试计划,查看结果树种该接口返回的响应结果,也是正确的。

四、postman实现加密接口测试

Postman工具中也提供了类前置Beanshell处理器的功能,那就是pre-request模块,采用的是js语法。

第一步:postman中创建百度通用翻译的post请求,设置如下图

第二步:在pre-request script中输入如下代码,实现对对签名字符串的加密,获取sign参数。

var md5 = CryptoJS.MD5("xxxx").toString();
console.log(md5)
// 设置md5加密后的签名到集合变量sign中
pm.collectionVariables.set("sign", md5);

第三步:点击send,运行接口,查看结果。

五、requests实现加密接口测试

使用python+requests也可以实现百度通用翻译接口,其中的签名md5加密可以使用python中的hashlib模块来实现。

实现代码如下:

import requests
import random
import hashlib
import json
import sys
while True:
    print("================百度翻译api练习====================")
    print("           1:翻译           2:退出")
    print("===================================================")
    select = input("请选择菜单数字:")
    fromL = ["auto","en","zh"]
    toL = ["zh","en","jp","kor"]
    if select == "1":
        print("=============您现在可以进行翻译了==============")
        print("可选的输入语言形式:1-自动  2-英文  3-中文")
        fromSel = fromL[int(input("请选择输入语言形式:"))-1]
        q = input("请输入你要查询的文字:")
        print("可选的翻译语言形式:1-中文  2-英文  3-日文  4-韩文")
        toSel = toL[int(input("请选择输入语言形式:"))-1]
        salt = str(random.randint(10000,99999))
 
        appid = 'xxxx’  #替换为自己的appid
        miyao = 'xxxx’  #替换为自己的密钥

        data = appid+q+salt+miyao
		#实现md5加密
        sign = hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
        url = "http://api.fanyi.baidu.com/api/trans/vip/translate"


        # print(sign)
        da = {
            "q":q,
            "from":fromSel,
            "to":toSel,
            "appid":appid,
            "salt":salt,
            "sign":sign
        }
 

        response = requests.get(url=url,params=da)
        print("=============翻译结果显示==============")
        print("您输入的文字是:",q)
        print("翻译的结果是:",json.loads(response.text)["trans_result"][0]["dst"])
        print("======================================")
        # print(json.loads(response.text))
    elif select=='2':
        print("=================欢迎再使用百度翻译===================")
        sys.exit()
    else:
        print("=================错误提示===================")
        print("你输入的菜单选项错误,请重试")
        continue

运行结果如下:

六、总结

此文借助一个参数加密的接口,通过postman、jmeter和requests三种不同的工具进行演示,仅仅作为抛砖引玉,在实际工作中,大家肯定会遇到更复杂的加密接口,看起来虽然有点唬人,但是通过本篇文章,你就可以拨开表皮看到本质了,无非就是加密解密的过程,只要知道了加密和解密算法(一般开发能提供),在不同工具中就可以采用不同语言(本文中就采用了三种语言,分别是java、js和python)中提供加密算法(或者开发提供的加密算法)进行接口实现了。

总结:在测试行业摸爬滚打也有十几年了,在学习的途中也是收藏了很多的学习资源,下面是软件测试到测试开发全职业生涯全套学习资料
【需要的可以点击下方官方推广小卡片扫码备注000免费领取】
 

在这里插入图片描述

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值