jmeter 自定义RSA加密函数
2019-11-15 本文已影响0人
一飞冲不了天
自定义函数需要实现以下几点
1.继承org.apache.jmeter.functions.AbstractFunction类
2.包名必须包含.functions
3.实现以下四个方法
-getArgumentDesc 返回关于实现的function的描述
-execute 执行方法入口,返回值就是自定义函数的返回值
-setParameters 传入函数的参数值
-getReferenceKey 返回function名称
4.引入两个jmeter包ApacheJMeter_core和ApacheJMeter_functions
参考代码
package customer.functions;
import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import javax.crypto.Cipher;
import org.apache.jmeter.engine.util.CompoundVariable;
import org.apache.jmeter.functions.AbstractFunction;
import org.apache.jmeter.functions.InvalidVariableException;
import org.apache.jmeter.samplers.SampleResult;
import org.apache.jmeter.samplers.Sampler;
public class EncryptData extends AbstractFunction{
private static final List<String> desc = new LinkedList<String>();
static {
desc.add("需要加密的文本字符串");
desc.add("公钥(用来加密)");
}
private Object[] values;
private static final String KEY = "__EncryptData";
public List<String> getArgumentDesc() {
// TODO Auto-generated method stub
return desc;
}
@Override
public String execute(SampleResult previousResult, Sampler currentSampler) throws InvalidVariableException {
try {
String content = ((CompoundVariable)values[0]).execute().trim();
String publicKey = ((CompoundVariable)values[1]).execute().trim();
return publicEncrypt(content, publicKey);
} catch (Exception e) {
throw new InvalidVariableException(e);
}
}
@Override
public void setParameters(Collection<CompoundVariable> parameters) throws InvalidVariableException {
// TODO Auto-generated method stub
checkParameterCount(parameters, 2);
//checkParameterCount(parameters, MIN_PARA_COUNT, MAX_PARA_COUNT);
values = parameters.toArray();
}
@Override
public String getReferenceKey() {
// TODO Auto-generated method stub
return KEY;
}
public String publicEncrypt(String str,String publicKey) {
System.out.println(str+publicKey);
try {
byte[] key = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key);
KeyFactory factory = KeyFactory.getInstance("RSA");
PublicKey publicK = factory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance(publicK.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicK);
int MAX_ENCRYPT_BLOCK = 100;
byte[] data = str.getBytes("utf-8");
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 java.util.Base64.getEncoder().encodeToString(encryptedData);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
}
porm.xml文件内容
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ext</groupId>
<artifactId>myJmeter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_functions</artifactId>
<version>4.0</version>
</dependency>
</dependencies>
</project>
最后,将项目打包成jar包,放到${JMETER_HOME}/lib/ext目录下面并重启jmeter