How Jmeter uses RSA for encryption


Preface

In interface testing or performance testing, we often encounter situations where data needs to be encrypted. This article mainly introduces the use of RSA encryption. The encryption code quoted comes from the Internet. I don’t know which expert shared it. I would like to express my gratitude!


1. Usage steps

1. Add BeanShell preprocessor

Insert image description here

2.Write a script

code show as below:

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;
import java.net.URLEncoder;
String RSA_PUB_KEY = props.get("pukey");//RSA加密的公钥
String KEY_ALGORITHM = "RSA";
String SIGNATURE_ALGORITHM = "MD5withRSA";
int MAX_ENCRYPT_BLOCK = 117;
int MAX_DECRYPT_BLOCK = 128;

public static byte[] decryptByPublicKey(byte[] encryptedData, 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.DECRYPT_MODE, publicK);
    int inputLen = encryptedData.length;
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    int offSet = 0;
    byte[] cache;
    int i = 0;
    // 对数据分段解密
    while (inputLen - offSet > 0) {
    
    
        if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
    
    
            cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
        } else {
    
    
            cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
        }
        out.write(cache, 0, cache.length);
        i++;
        offSet = i * MAX_DECRYPT_BLOCK;
    }
    byte[] decryptedData = out.toByteArray();
    out.close();
    return decryptedData;
}

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 = "12345678";//这里设置为自己的密码
String result = "";

try {
    
    
    result = Base64.encodeBase64String(encryptByPublicKey(str.getBytes(), RSA_PUB_KEY));

    result1 = encryptByPublicKey(str.getBytes(), RSA_PUB_KEY);
    System.out.println(result);
} catch(Exception e) {
    
    
    // TODO Auto-generated catch block
    e.printStackTrace();
}

print(result);
vars.put("rsa_pwd", result);//rsa_pwd是jmeter脚本中引用的变量名
return result1;

 


Code analysis:
1. Line 10 is filled with the public key of RSA.
Insert image description here
2. Line 81 is filled with the original string that needs to be encrypted. For example, if you want to encrypt the password, fill in the password here.
Insert image description here

3. Line 95 of the code stores the encrypted string result as a Jmeter variable for easy reference in Jmeter.
Insert image description here


Summarize

The above is what I will talk about today. This article only briefly introduces how to use RSA for encryption in Jmeter.

Guess you like

Origin blog.csdn.net/liangxiaoyan0426/article/details/130864278