• 资深8年测试整理,接口测试必备-加密与签名,让你不再走弯路...



    前言

    1、接口加密解密

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

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

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

    2)加密方式分类?

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

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

    2、加密方式

    1)加对称密技术

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

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

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

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

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

    ① B把自己的公钥发送给A(公钥是公开的)
    ② A使用这个公钥把数据报文进行加密,加密完成传给B(加密后的密文通过网络传给B)
    ③ B使用自己的秘钥解密得到数据报文

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

    数字证书由来:因为公钥是公开的不安全,所以需要第三方的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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    Jmeter举例:

    函数助手:__digest

    ${__digest(MD5.admin,,,)}
    
    • 1

    3、接口签名

    1)什么是接口签名?

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

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

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

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

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

    {"c":"3","b":"2","a":"1"}
    
    {"1":"1","b":"2","c":"3"}
    
    • 1
    • 2
    • 3

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

    a=1&b=2&c=3
    
    • 1

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

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

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

    appid=admin&appsecret=123&a=1&b=2&c=3&timestamp=124124252
    
    • 1

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

    sign=E48B34F95AE8001C99CB86A612538C04
    
    • 1

    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 自带的全局变量
       }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    下面是我整理的2023年最全的软件测试工程师学习知识架构体系图

    一、Python编程入门到精通

    请添加图片描述

    二、接口自动化项目实战

    请添加图片描述

    三、Web自动化项目实战

    请添加图片描述

    四、App自动化项目实战

    请添加图片描述

    五、一线大厂简历

    请添加图片描述

    六、测试开发DevOps体系

    请添加图片描述

    七、常用自动化测试工具

    请添加图片描述

    八、JMeter性能测试

    请添加图片描述

    九、总结(尾部小惊喜)

    每一个成功的人都曾历经挫折与失败,但他们不放弃,一次次地爬起来,坚定前行。在通往梦想的路上,要有勇气和决心,用热血和汗水创造属于自己的辉煌!

    在茫茫人海中,只有敢于坚持梦想、勇于追求的人才能书写属于自己的传世之作。不畏艰辛,放飞心灵的翅膀,奋斗不息,绽放绚烂的人生华章!

    只要你相信自己的力量,勇往直前,坚持不懈,没有什么是不能达成的。在奋斗的道路上,努力成就辉煌,让梦想化作燃烧的火焰,点亮未来的星空!

  • 相关阅读:
    Android intent的一些小使用
    echarts 实现双y轴折线图示例
    UI设计是什么意思?一文给你讲清楚
    10K涨到30K,5年大厂横跳,经验全在这两份Java面试精华总结里了
    解决nvm切换node版本失败的终极办法-秒杀网上99%的水文
    Linux C应用编程-5-线程
    什么是测试架构师(经验总结)
    C++ continue 语句
    Mac下搭建Texstudio+Textlive(Mactex)
    如何优雅得关闭协程呢
  • 原文地址:https://blog.csdn.net/csdnchengxi/article/details/133790541