Postman 加密接口测试 | 使用Rsa、Aes对参数加密

2024-06-06 03:52

本文主要是介绍Postman 加密接口测试 | 使用Rsa、Aes对参数加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

做接口加密的测试也是上次遇到的,在这之前,都是在浏览器登录后,从请求头中复制 token 过来测试....

说真的,一瞬间我都有点诧异,这样也太麻烦了吧~,因而也就产生了这篇文章。

还有一些问题:

  1. postman 有内置加密Api,但不支持RSA加解密码。 (引入其他的js文件至环境变量,利用eval 函数进行解析,还可以利用request获取,将其保存至全局变量中)
  2. postman 中 request对象属性皆为只读,如何把提交时的明文变为密文? (前置脚本)

我先说说本次文章最终要实现的效果,以给大家一个阅读的参考。

目标:在测试登录接口时,针对登录接口需要用到的 username、password进行加密(加密方式分别为 rsa、aes ),再将加密后的数据传输给后端。

方法都是相似的,知道如何加密,其他的接口和字段都是差不多的实现方式。

一、Postman

对于Postman,对于这个工具,我认为是大都数小伙伴都要会的一个工具~,只是学习的程度的不同罢了

大致就是分为:

1、刚学的我们,就是用来测试一些基本接口

2、用了一段时间的我们,知道了有环境变量、集合操作等

3、了解到 postman 中可以结合Js文件对请求做一些参数,断言等等

4、集合接口测试、编写测试用例、利用内置变量随机生成数据测试接口等

5、.......


今天用到的就是 Postman 中的前置脚本Pre-request Script

二、Pre-request Script 编写前置脚本

2.1、脚本执行顺序

说之前,先说说postman中脚本的执行顺序,这里贴一张官方的图 postman 官方文档

在 Postman 中,单个请求的脚本执行顺序如下所示:

  • 与请求关联的预请求脚本将在发送请求之前执行
  • 与请求关联的测试脚本将在请求发送后执行

单个请求的工作流程

在发起request请求前,会先执行前置脚本,收到接口返回结果后,再执行 test script

2.2、准备测试接口信息

准备一个后端请求接口,能接收请求参数即可,我采取的是将加密的信息打印

测试接口信息

http://localhost:8080/login

 

json

复制代码

 {      "username":"{{rsa:username}}",      "password":"{{esc:password}}"  }

补充:用双层大括号包裹的参数,是引用postman的环境变量,做到动态可变

参数名前的:rsa,aes是为了测试多种加密方式给加的判断依据。

image-20220811215659641

(图片说明:增加一个接口,填入基本信息)

2.3、Postman设置环境变量

这两处我们都需要用到~

image.png

接口用到的数据,一般是存放在某一个环境变量中,

如果很多处用到,一般可以考虑放到全局变量中了~

我们将rsa:username、aes:password放到一个环境变量中,这个环境变量的名称的就叫login

点击上图中的add即可

image.png

(图片说明:记得 ctrl + s 保存噢,手误:esc应为aes

另外我们用全局变量来保存一下 rsa的公钥,我这里的公私钥都是拿工具直接生成的 工具链接

image.png

将公钥保存在postman的全局变量中

image.png

另外全局变量之后我们用要来保存用来加密的 js 文件,不过这一步是利用前置脚本做的。

下载forge
 

bash

复制代码

 git clone https://github.com/digitalbazaar/forge.git  cd forge文件夹下  npm install

image.png

这样就算安装完了,否则会一直报没有找到 forge 对象

2.4、编写前置脚本

我们今天编写前置脚本的作用,就是给接口的参数进行加密,

所以最简单的方式,

  1. 拿到js文件,
  2. 运行
  3. 将参数进行加密
 

php

复制代码

 // ------ 导入RSA ------  if(!pm.globals.has("forgeJS")){    pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", (err, res) => {      if (!err) {          // 保存至全局变量中,forgeJs 为 key,res.text() 为value值          pm.globals.set("forgeJS", res.text())     }  })}  ​  // 这个函数前端的小伙伴应该比较了解  // 它的作用是把对应的字符串解析成js代码并运行(将json的字符串解析成为JSON对象);  eval(postman.getGlobalVariable("forgeJS"));  ​  // ------------ AES 加密 ------------  function aesEncrypt(content){      const key = CryptoJS.enc.Utf8.parse("Y5MUIOM7BUWI7BQR");      const iv = CryptoJS.enc.Utf8.parse('S41AXIPFRFVJL73Z');      const encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});      return encrypted.toString();  }  ​  // ------------ RSA 加密 ------------  function rsaEncrypt(content){      const pubKey = postman.getGlobalVariable("RSA_Public_Key");      if(pubKey){          const publicKey = forge.pki.publicKeyFromPem(pubKey);          const encryptedText = forge.util.encode64(              publicKey.encrypt(content, 'RSAES-PKCS1-V1_5', {                md: forge.md.sha1.create(),                mgf: forge.mgf.mgf1.create(forge.md.sha1.create())         }));          return encryptedText;     }  }  pm.environment.set("rsa:username", aesEncrypt("nzc_wyh"));   pm.environment.set("aes:password", rsaEncrypt("123456"));

我后端的接口返回数据就是将加密的数据直接放回~

这种方式接口的测试结果~

image-20220811233914894

运行完查看环境变量和全局全量的变化

image-20220811234115035

思考:但是你能感觉到这个前置脚本存在的问题吗?

如果同一个请求中有多个参数要进行加密,那我们岂不是要写多次set,这显然是不合理的,下面就做一个改善

当然如果不会的话,我们可以一起请教前端小伙伴,以让代码更加完善。

2.5 、优化前置脚本

 

ini

复制代码

 // ------ 通用方法 ------  // 提取{{}}中内容  function getBracketStr(text) {     let result = ''     let regex = /{{(.+?)}}/g;     let options = text.match(regex);     if (options && options.length > 0) {         let option = options[0];         if (option) {             result = option.substring(2, option.length - 2)         }     }     return result  }  ​  ​  // ------ 导入RSA ------  if(!pm.globals.has("forgeJS")){   pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", (err, res) => {     if (!err) {         // 保存至全局变量中,forgeJs 为 key,res.text() 为value值         pm.globals.set("forgeJS", res.text())     }  })}  ​  // 这个函数前端的小伙伴应该比较了解  // 它的作用是把对应的字符串解析成js代码并运行(将json的字符串解析成为JSON对象);  eval(postman.getGlobalVariable("forgeJS"));  ​  // ------------ AES 加密 ------------  function aesEncrypt(content){     const key = CryptoJS.enc.Utf8.parse("Y5MUIOM7BUWI7BQR");     const iv = CryptoJS.enc.Utf8.parse('S41AXIPFRFVJL73Z');     const encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});     return encrypted.toString();  }  ​  ​  // ------------ RSA 加密 ------------  function rsaEncrypt(content){     const pubKey = postman.getGlobalVariable("RSA_Public_Key");     if(pubKey){         const publicKey = forge.pki.publicKeyFromPem(pubKey);         const encryptedText = forge.util.encode64(             publicKey.encrypt(content, 'RSAES-PKCS1-V1_5', {               md: forge.md.sha1.create(),               mgf: forge.mgf.mgf1.create(forge.md.sha1.create())         }));         return encryptedText;     }  }  // 获取当前请求中的加密变量 这里判断为字符串的原因是,  // 我们引用环境变量时,一定是"{{}}" 这种格式的  let requestData;  if((typeof request.data) === 'string'){     requestData = JSON.parse(request.data)  } else {     requestData = request.data;  }  ​  // Object.assign 拷贝对象 将request.headers 中的所有数据,拷贝到 requestData中  requestData = Object.assign(requestData, request.headers);  ​  // 遍历  Object.keys(requestData).map(key => {   // 内容     let value = requestData[key] + '';     // 是否为变量     if (value.indexOf('{{') !== -1) {         let content = getBracketStr(value);         // 判断用是否加密,加密的话又是用哪种方式加密         if (content.indexOf('aes:') !== -1) {             let c = content.split('aes:')[1];             let encryptedContent = pm.environment.get(c); // 加密内容             encryptedContent = encryptedContent ? encryptedContent : c;             pm.environment.set(content, aesEncrypt(encryptedContent));         } else if (content.indexOf('rsa:') !== -1) {             let c = content.split('rsa:')[1];             let encryptedContent = pm.environment.get(c); // 加密内容             encryptedContent = encryptedContent ? encryptedContent : c;             pm.environment.set(content, rsaEncrypt(encryptedContent));         }     }  });  ​

优点

  1. 如果同一个请求中有多个参数加密,不用手动set,而是通过循环全部set进去
  2. 可以使用多种加密方式,只要继续扩展即可
  3. 扩展性更高

测试结果:

image.png

  总结

如果你对此文有任何疑问,如果你也需要接口项目实战,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入我们,加入方式在文章的最后面

  自动化测试相关教程推荐:

2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili

2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili

测试开发相关教程推荐

2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili

postman/jmeter/fiddler测试工具类教程推荐

讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili

2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili

2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili

  总结:

 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

​​​

​​​

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!

这篇关于Postman 加密接口测试 | 使用Rsa、Aes对参数加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035014

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca