不管是接口测试还是性能测试,在遇到接口有加密入参的时候,该怎么办?
于是从开发手中拿到了加密代码,从代码结构上看是没问题,开发也是调用别人写好的算法,只不过加入了自己的密钥和选择不同的加密方式而已。但是开发齐刷刷的丢了三个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 {
// 初始化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.bouncycastlegroupId>
<artifactId>bcprov-jdk16artifactId>
<version>1.46version>
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应用起来,总有一款方法适合你;所以共勉!日拱一卒无有尽,功不唐捐终入海!