目录
Fiddler不能直接抓取https协议的数据报文,需要安装一个数字证书
加密:在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。
解密:将加密还原成原始数据
对称式加密:对加密和解密使用的是同一个密钥
非对称式加密:非对称式加密需要两个密钥(双钥),分别叫公钥和秘钥,这两把秘钥可以互相加解密,公钥公开的,不需要保密,私钥是保密的。
DES加密算法:加密安全性弱,一般应用于旧的系统里面
AES加密算法:一般用于前后端分离的接口加密
Base64加密算法:编码的方式
RSA加密算法:最有影响力的加密算法
两个用户。A和B,B有双钥,A想要把一个数据报文通过加密的方式传给B。
1、B把自己的公钥发送给A(公钥是公开的)
2、A使用这个公钥把数据报文进行加密,加密完成传给B(加密后的密文通过网络传给B)
3、B使用自己的秘钥解密得到数据报文
数字证书由来:因为公钥是公开的不安全,所以需要第三方的CA(数字证书颁发机构)对公钥进行加密,加密后的东西就叫数字证书。数字证书包括:B用户基本信息以及B公钥的信息,部分证书也附有有效期。X509的标准
CA:双钥,通过私钥加密
验证签名:身份验证。
两个用户。A和B,B有双钥
1、B把需要发送的数据报文通过私钥加密。
2、B找到CA把自己的公钥做认证
3、CA就用自己的私钥对B的公钥和一些相关的信息一起加密,生成数字证书
4、CA就会把数字证书发给B
5、B将密文和数字证书都传给A
6、A用CA的公钥去解开数字证书,拿到B的公钥,在使用公钥解密密文,从而得到数据报文
https协议=http协议+SSL安全传输协议
SSL安全传输协议:安全套接层。NetScape(B)研发,Fiddler(A),CA把数字证书发到网上,数字证书生成器。
Postman举例:在Tests中
//获得当前时间戳
new times = new Date().getTime()
//使用MD5加密
var miwen = CryptoJS.MD5("admin").toString().toUpperCase()
Jmeter
函数助手:__digest
${__digest(MD5.admin,,,)}
使用用户名,密码,时间戳和所有的排序过的参数组合起来,再加密得到的字符串,字符串是唯一的有权访问第三方金融接口的鉴权码=sign接口签名。
1、防伪装攻击
2、防篡改攻击
3、防存放攻击
4、防数据泄漏
1、对所有的请求的参数按key按ASCII码做升序排列。
{"c":"3","b":"2","a":"1"}
{"1":"1","b":"2","c":"3"}
2把参数名和参数值连接成字符串:
a=1&b=2&c=3
3、用申请到的appid和appsecret连接到字符串的头部
appid:用户名
appsecret:密码
appid=admin&appsecret=123&a=1&b=2&c=3
4、用时间戳连接字符串的尾部
appid=admin&appsecret=123&a=1&b=2&c=3×tamp=124124252
5、然后再把这个字符串安装32位的MD5加密,加密后再转换成大写。
sign=E48B34F95AE8001C99CB86A612538C04
10秒有效。
jmeter实现并且分装成函数的话:自定义函数 jave python
Pre-request-Script
//url=https://aaa/sss?com=aaa&nu=hhh&phone=jjjjj&show_appid=jj&showapi_timestamp={{time}}&showapi_sign={{sign}}
var moment = require('moment')//获取时间戳
console.log(request.url);//获取请求信息
var url = request.url;
var param = url.split("?")[1]//取到url的?后面的值,按照?分割,取前面就是0
if(param != null)
{
var time = moment().format("YYYYMMDDHHmmss")//取当天时间按照YYYYMMDDHHmmss形式显示
pm.environment.set("time",time);//postman 自带的 全局变量
param+="&showapi_timestamp="+time;
param+="&showapi_sign=122344556";
var param = param.split("&") ;//分割变成一个list
param.sort();//按照要求的方式进行排序a-z
var keys = new Array(param.length);
var values = new Array(param.length);
for(var i=0;i<param.length;i++)
{
keys[i]=param[i].split("=")[0]//取=前面的值
values[i]=param[i].split("=")[1]//取=后面的值
}
var str=[]
for(var p=0;p<keys.length;p++)//如果发现keys需要sign,就不参与验签
{
if (keys[p]=="showapi_sign"||values[p]=="{{time}}")
{
continue;
}
str.push(keys[p]+value[p]);
}
var sign = str.join("")
sign = sign+"sssss";//加密钥
pm.environment.set("sign",CryptoJs.MD5(sign).toString());//postman 自带的全局变量
}