JMETER也会遇到加密难题,一并处理中文响应乱码

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 本文讨论了在JMeter中处理加密数据和中文响应乱码的问题,提供了使用BeanShell后处理器进行AES加密的示例代码,说明了如何将自定义的jar包放入JMeter的lib/ext目录以扩展功能,并给出了解决中文乱码的几种方法。

JMeter是一款开源的Java应用性能测试工具,常被用于模拟大量用户访问以测试服务器的负载能力。在JMeter的实际使用过程中,我们有时会遇到加密数据的问题,尤其是当服务器返回的数据包含中文时,可能会遇到乱码的情况。本文将探讨如何在JMeter中处理加密难题和中文响应乱码的问题。

一、JMeter中的加密处理

JMeter本身不直接提供加密功能,但可以通过插件或后处理器来实现。一种常见的方法是使用JMeter的BeanShell后处理器或JSR223后处理器(支持Groovy、JavaScript等多种语言)来处理加密逻辑。

示例:使用BeanShell后处理器进行加密处理

  1. 在JMeter的HTTP请求下添加一个BeanShell后处理器。
  2. 在BeanShell后处理器的脚本编辑器中输入加密代码,例如使用Java的内置加密库进行AES加密:
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 {
   
   
            // 初始化cipher
            cipher = 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添加依赖哦
    <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk16</artifactId>
      <version>1.46</version>
    </dependency>

二、导出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,进入Options -> Encoding 设置。
  • 修改jmeter.properties文件的sampleresult.default.encoding字符集,默认是ISO-8859-1,改成utf-8
  • 或者在sampler请求之前增加beanshell元件,代码:prev.setDataEncoding(“utf-8”);
  • 将HTTP Response和HTTP Request的Default character encoding设置为UTF-8。
    在这里插入图片描述

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

四、总结

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

相关文章
|
11月前
|
JSON 测试技术 数据格式
5 JMeter断言-Jmeter响应中出现乱码时
5 JMeter断言-Jmeter响应中出现乱码时
|
10月前
|
前端开发 JavaScript 数据安全/隐私保护
Jmeter模拟加密密码登录
Jmeter模拟加密密码登录
229 0
|
3月前
|
XML JSON 测试技术
JMeter 响应断言详解:提升测试精度的利器
**摘要:** Apache JMeter的响应断言用于验证性能和功能测试中的系统响应。常见的断言类型包括文本、JSON、XPath、XML、响应代码和时间断言。配置断言涉及添加采样器、选择断言类型及设定相关参数。最佳实践建议选择合适断言类型、减少断言数量、使用正则表达式,并结合前置和后置处理器。实例演示了如何配置文本、JSON和响应代码断言来验证登录接口的成功响应。响应断言确保了测试的准确性与效率。
42 0
|
4月前
|
测试技术 API
使用 jMeter 给 Spartacus SSR 发送 100 个并发的 SSR 请求,全部被 SSR 响应了
使用 jMeter 给 Spartacus SSR 发送 100 个并发的 SSR 请求,全部被 SSR 响应了
|
11月前
|
JavaScript 安全 数据安全/隐私保护
JS逆向 -- 分析被加密的响应数据
JS逆向 -- 分析被加密的响应数据
76 0
|
JSON 自然语言处理 数据安全/隐私保护
jmeter响应和json断言,json断言提取多个值
jmeter响应和json断言,json断言提取多个值
jmeter响应结果乱码处理和基本使用
jmeter响应结果乱码处理和基本使用
|
2天前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第11天】在数字时代,网络安全和信息安全已经成为我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术以及安全意识等方面的知识,帮助读者更好地了解网络安全的重要性,并提供一些实用的建议来保护自己的信息安全。
|
2天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【9月更文挑战第11天】在数字时代,网络安全和信息安全已经成为了我们生活中不可或缺的一部分。本文将介绍网络安全漏洞、加密技术以及安全意识等方面的知识,帮助读者更好地了解如何保护自己的网络安全和信息安全。同时,本文还将提供一些代码示例,让读者更加深入地理解这些概念。