赞
踩
JMeter是一款开源的Java应用性能测试工具,常被用于模拟大量用户访问以测试服务器的负载能力。在JMeter的实际使用过程中,我们有时会遇到加密数据的问题,尤其是当服务器返回的数据包含中文时,可能会遇到乱码的情况。本文将探讨如何在JMeter中处理加密难题和中文响应乱码的问题。
JMeter本身不直接提供加密功能,但可以通过插件或后处理器来实现。一种常见的方法是使用JMeter的BeanShell后处理器或JSR223后处理器(支持Groovy、JavaScript等多种语言)来处理加密逻辑。
示例:使用BeanShell后处理器进行加密处理
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); } } }
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk16</artifactId>
<version>1.46</version>
</dependency>
以上代码当然是在java编辑工具里调试的,但是它要在jmeter何处使用呢?
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
前面说了,该加密方法用了一个工具包bouncycastle,记得也要把它的jar包放在lib/ext里,不然你的beanshell就调用不到了
温馨提示:beanshell脚本的好处,就是它没有最外层的类名,方法直接写,直接调用即可;还有它不用写自己的包路径,直接导你需要的包即可。要是不会就来找笔者吧!
这是个很常见的问题,基本很多时候都能莫名其妙的遇到,当然笔者也提供了几种方式可供调试
解决,调试一下,结果输出如下,完美!
这里也会遇到粉丝常问的一个问题,beanshell怎么用?外部jar怎么在jmeter中使用?这简直很要命,因为在问之前,自己没有深入思考,至少没有看过jmeter官方操作手册,总是在我行我素、一意孤行,让自己陷入无法解决问题的深渊;正如笔者记录的一样,既然jar导出在jmeter用不起来,那么就把代码在beanshell应用起来,总有一款方法适合你;所以共勉!日拱一卒无有尽,功不唐捐终入海!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。