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

上一篇 下一篇

猜你喜欢

热点阅读