接口测试:加密和签名

**🍅 点击文末小卡片 ,**免费获取软件测试全套资料,资料在手,涨薪更快

1、什么是加密以及解密?

**加密:**在网络上传输的原始数据(明文)经过加密后形成(密文)传输,防止被窃取。

**解密:**将加密还原成原始数据

2、加密方式分类?

**对称式加密:**对加密和解密使用的是同一个密钥

**非对称式加密:**非对称式加密需要两个密钥(双钥),分别叫公钥和秘钥,这两把秘钥可以互相加解密,公钥公开的,不需要保密,私钥是保密的。

一、加密方式详解

1、加对称密技术:

  • DES加密算法:加密安全性弱,一般应用于旧的系统里面
  • AES加密算法:一般用于前后端分离的接口加密
  • Base64加密算法:编码的方式

2、非对称加密技术(RSA加密算法)

RSA加密算法:最有影响力的加密算法

场景1:通过公钥加密通过私钥解密

两个用户。A和B,B有双钥,A想要把一个数据报文通过加密的方式传给B。

① B把自己的公钥发送给A(公钥是公开的)

② A使用这个公钥把数据报文进行加密,加密完成传给B(加密后的密文通过网络传给B)

③ B使用自己的秘钥解密得到数据报文

场景2:私钥加密:数字签名公钥解密:验证签名

  • 数字证书由来:因为公钥是公开的不安全,所以需要第三方的CA(数字证书颁发机构)对公钥进行加密,加密后的东西就叫数字证书。数字证书包括:B用户基本信息以及B公钥的信息,部分证书也附有有效期。X509的标准
  • CA:双钥,通过私钥加密
  • 验证签名:身份验证。

两个用户。A和B,B有双钥

① B把需要发送的数据报文通过私钥加密。

② B找到CA把自己的公钥做认证

③ CA就用自己的私钥对B的公钥和一些相关的信息一起加密,生成数字证书

④ CA就会把数字证书发给B

⑤ B将密文和数字证书都传给A

⑥ A用CA的公钥去解开数字证书,拿到B的公钥,在使用公钥解密密文,从而得到数据报文

Fiddler不能直接抓取https协议的数据报文,需要安装一个数字证书

https协议=http协议+SSL安全传输协议

**SSL安全传输协议:**安全套接层。

NetScape(B)研发,Fiddler(A),CA把数字证书发到网上,数字证书生成器。

3、MD5(完全不考虑解密,也叫做哈希算法,散列算法)

复制代码
Postman举例:在Tests中
//获得当前时间戳
new 
times = 
new Date().getTime()
//使用MD5加密
var 
miwen 
=
CryptoJS
.MD5("admin").toString().toUpperCase()
Jmeter
函数助手:__digest
${__digest(MD5.admin,,,)}

二、接口签名

1、什么是接口签名?

使用用户名,密码,时间戳和所有的排序过的参数组合起来,再加密得到的字符串,字符串是唯一的有权访问第三方金融接口的鉴权码=sign接口签名。

2、为什么要做接口签名?

  • 防伪装攻击
  • 防篡改攻击
  • 防存放攻击
  • 防数据泄漏

3、如何做接口签名,了解签名的规则:

对所有的请求的参数按key按ASCII码做升序排列。

复制代码
{"c":"3","b":"2","a":"1"}
{"1":"1","b":"2","c":"3"}

把参数名和参数值连接成字符串:

复制代码
a
=
1&b=2&c=3

用申请到的appid和appsecret连接到字符串的头部

复制代码
appid
:
用户名
appsecret
:
密码
appid
=
admin&appsecret=123&a=1&b=2&c=3

用时间戳连接字符串的尾部

复制代码
appid
=
admin&appsecret=123&a=1&b=2&c=3×tamp=124124252

然后再把这个字符串安装32位的MD5加密,加密后再转换成大写。

复制代码
sign
=
E48B34F95AE8001C99CB86A612538C04

10秒有效。

jmeter实现并且分装成函数的话:自定义函数 jave python

4、postman实现并且封装成函数:JavaScript

复制代码
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 自带的全局变量}

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。

相关推荐
SiYuanFeng1 小时前
Colab复现 NanoChat:从 Tokenizer(CPU)、Base Train(CPU) 到 SFT(GPU) 的完整踩坑实录
python·colab
炸炸鱼.2 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
_深海凉_2 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦3 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu3 小时前
Python 语法之数据结构详细解析
python
AI问答工程师3 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5204 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕4 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙4 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话5 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习