作为测试 时间长了 就会慢慢接触接口 测试 ,但是碰到一些加密的接口就会感到 无从下手。想要使用接口加密 ,首先要了解 你们接口加密的原理 ,有的是淡出的 rsa 加密、有的是分段的rsa加密,而我们的接口是先经过unicode 编码 后再次进行 rsa分段加密,接下来我们说一下 用jmeter进行rsa加密接口测试
Jmeter 是一个不错的接口测试工具 。其实接口加密 jmeter为我们提供了两种 方式 :
一、使用jmeter 前置处理器 Jsr223 Processor 这个处理处理器 主要是针对与 js处理加密
第二种就是我们要说的 通过BeanShell 这种方式加密 主要是针对会Java 代码 的同学
加密 方式可以通过添加 前置处理器 BeanShell Processor 或着直接 添加 BeanShell sampler我这里直接添加了BeanShell sampler
import org.apache.commons.codec.binary.Base64;
import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;
public static String RSA_PUB_KEY = "公钥";
public static String KEY_ALGORITHM = "RSA";
public static String SIGNATURE_ALGORITHM = "MD5withRSA";
public static int MAX_ENCRYPT_BLOCK = 85;
public static int MAX_DECRYPT_BLOCK = 128;
public static byte[] encryptByPublicKey(byte[] data, String publicKey)
throws Exception {
byte[] keyBytes = Base64.decodeBase64(publicKey);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key publicK = keyFactory.generatePublic(x509KeySpec);
// 对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicK);
int inputLen = data.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段加密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);
} else {
cache = cipher.doFinal(data, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_ENCRYPT_BLOCK;
}
byte[] encryptedData = out.toByteArray();
out.close();
return encryptedData;
}
String str = "登陆接口要加密的字符串";
StringBuffer unicode = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
unicode.append("\\u"+Integer.toHexString(c));
}
String result = Base64.encodeBase64String(encryptByPublicKey(unicode.toString().getBytes(),RSA_PUB_KEY));
print(unicode);
print(result);
vars.put("sign",result);
这个代码里添加了 对加密前的字符串 转码
在实现过程中 遇到了
org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Invalid escape character at line 95 column 34.这个问题 提示的是在 这个地方 无效的转义符 网上查找好多 资料 没有解决 办法 ,尝试了很多方法 都不管用 后来 使用 用户变量 解决这个问题 BeanShell 应用该变量 解决问题