JMETER也会遇到加密难题,中文乱码也能一并处理
创始人
2024-02-18 21:44:14
0

文章目录

      • 加密的接口测试
      • 导出jar包,放入jmeter的lib/ext扩展目录
      • JMeter输出中文乱码
      • 总结

加密的接口测试

不管是接口测试还是性能测试,在遇到接口有加密入参的时候,该怎么办?

  • 毫无疑问,放弃自己实现的想法,除非自己很懂,别装了,还是先问问开发算法名称是啥吧!

于是从开发手中拿到了加密代码,从代码结构上看是没问题,开发也是调用别人写好的算法,只不过加入了自己的密钥和选择不同的加密方式而已。但是开发齐刷刷的丢了三个java文件过来,笔者瞬间惊呆了,因为只要一个加密方法的java文件即可,于是笔者终于选出了正确的代码。

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.Security;
import java.util.Arrays;public class AESUtil {// 算法名称final static String KEY_ALGORITHM = "AES";// 加解密算法/模式/填充方式final static String ALGORITHM_PKCS7 = "AES/CBC/PKCS7Padding";final static String ALGORITHM_ZERO = "AES/CBC/ZEROBYTEPADDING";private Key key;private Cipher cipher;byte[] iv = {0x30, 0x31, 0x30, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x35, 0x30, 0x36, 0x30, 0x37, 0x30, 0x38};private void init(byte[] keyBytes, String algorithmStr) {// 如果密钥不足16位,那么就补足.  这个if 中的内容很重要int base = 16;if (keyBytes.length % base != 0) {int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);byte[] temp = new byte[groups * base];Arrays.fill(temp, (byte) 0);System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);keyBytes = temp;}// 初始化Security.addProvider(new BouncyCastleProvider());// 转化成JAVA的密钥格式key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);try {// 初始化ciphercipher = Cipher.getInstance(algorithmStr, "BC");} catch (Exception e) {throw new RuntimeException(e);}}/*** 加密方法** @param content 要加密的字符串* @param pwd     加密密钥* @return Base64*/public byte[] encrypt(String content, String pwd) {init(pwd.getBytes(), ALGORITHM_PKCS7);try {cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));byte[] encryptedText = cipher.doFinal(content.getBytes());return Base64.encode(encryptedText);} catch (Exception e) {throw new RuntimeException(e);}}
}
  • 上面的代码片段,用了一个工具包bouncycastle,记得在maven项目中pom添加依赖哦
    org.bouncycastlebcprov-jdk161.46

导出jar包,放入jmeter的lib/ext扩展目录

以上代码当然是在java编辑工具里调试的,但是它要在jmeter何处使用呢?

  • JMeter登场,笔者习惯使用jmeter来完成性能测试任务;至于怎么导出可用的jar,可以百度问问他人,因为笔者导出的方式(当然也是别人的方式),最终得到了如下错误,就是,嗯,包没打齐活的意思。
2022-11-07 10:26:21,322 ERROR o.a.j.r.ClassFinder: Error filtering class org.bouncycastle.x509.extension.AuthorityKeyIdentifierStructure, it will be ignored
java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

在这里插入图片描述

  • 那到这里笔者是放弃了吗?很显然,这不是笔者的风格,JMeter工具的beanshell元件即可导包也可编写java片段的代码
    在这里插入图片描述

前面说了,该加密方法用了一个工具包bouncycastle,记得也要把它的jar包放在lib/ext里,不然你的beanshell就调用不到了
在这里插入图片描述
温馨提示:beanshell脚本的好处,就是它没有最外层的类名,方法直接写,直接调用即可;还有它不用写自己的包路径,直接导你需要的包即可。要是不会就来找笔者吧!

JMeter输出中文乱码

这是个很常见的问题,基本很多时候都能莫名其妙的遇到,当然笔者也提供了几种方式可供调试
在这里插入图片描述

  • 修改jmeter.properties文件的sampleresult.default.encoding字符集,默认是ISO-8859-1,改成utf-8
  • 或者在sampler请求之前增加beanshell元件,代码:prev.setDataEncoding(“utf-8”);
  • 又或者在sampler的content encoding输入:utf-8
    在这里插入图片描述

解决,调试一下,结果输出如下,完美!
在这里插入图片描述

总结

这里也会遇到粉丝常问的一个问题,beanshell怎么用?外部jar怎么在jmeter中使用?这简直很要命,因为在问之前,自己没有深入思考,至少没有看过jmeter官方操作手册,总是在我行我素、一意孤行,让自己陷入无法解决问题的深渊;正如笔者记录的一样,既然jar导出在jmeter用不起来,那么就把代码在beanshell应用起来,总有一款方法适合你;所以共勉!

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...