对于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免费领取】