如何在JMeter中编写Jcryption加密代码?
在JMeter中实现Jcryption加密的实操步骤
Jcryption本质是RSA+AES的混合加密方案,结合你已获取密钥、从CSV读参数的场景,直接按以下步骤实现:
1. 添加JSR223预处理器
在需要传递加密值的HTTP请求节点下,添加「JSR223 PreProcessor」,语言选择Groovy(JMeter中性能最优的脚本语言)。
2. 编写Groovy加密代码
根据你获取的密钥类型,选择对应代码:
场景1:已关联获取RSA公钥
如果拿到的是服务端下发的RSA公钥(存在${rsa_public_key}变量),需要先生成AES密钥,用RSA加密后再加密CSV传入的明文参数:
import javax.crypto.Cipher import javax.crypto.KeyGenerator import javax.crypto.SecretKey import java.security.KeyFactory import java.security.spec.X509EncodedKeySpec import org.apache.commons.codec.binary.Base64 import java.security.SecureRandom // 生成128位AES密钥(匹配Jcryption默认配置) KeyGenerator aesKeyGen = KeyGenerator.getInstance("AES") aesKeyGen.init(128) SecretKey aesKey = aesKeyGen.generateKey() // 处理RSA公钥,去除头部、尾部及换行符 String rsaPubKeyRaw = vars.get("rsa_public_key") rsaPubKeyRaw = rsaPubKeyRaw.replaceAll("-----BEGIN PUBLIC KEY-----", "") .replaceAll("-----END PUBLIC KEY-----", "") .replaceAll("\\s+", "") byte[] pubKeyBytes = Base64.decodeBase64(rsaPubKeyRaw) X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKeyBytes) KeyFactory keyFactory = KeyFactory.getInstance("RSA") // RSA加密AES密钥(算法需和客户端一致,这里用PKCS1Padding,若客户端用OAEP需替换) Cipher rsaCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") rsaCipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePublic(keySpec)) byte[] encryptedAesKey = rsaCipher.doFinal(aesKey.getEncoded()) String encryptedAesKeyBase64 = Base64.encodeBase64String(encryptedAesKey) // AES加密CSV传入的明文参数(CBC模式,生成随机IV,若客户端用固定IV则替换) byte[] iv = new byte[16] new SecureRandom().nextBytes(iv) Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding") aesCipher.init(Cipher.ENCRYPT_MODE, aesKey, new javax.crypto.spec.IvParameterSpec(iv)) byte[] encryptedParam = aesCipher.doFinal(vars.get("plain_param").getBytes("UTF-8")) String encryptedParamBase64 = Base64.encodeBase64String(encryptedParam) String ivBase64 = Base64.encodeBase64String(iv) // 存为JMeter变量,供后续请求使用 vars.put("encrypted_aes_key", encryptedAesKeyBase64) vars.put("encrypted_param", encryptedParamBase64) vars.put("iv", ivBase64)
场景2:已关联获取AES密钥(含IV)
如果已经拿到客户端协商好的AES密钥(${aes_key})和初始化向量IV(${iv}),直接加密CSV参数即可:
import javax.crypto.Cipher import javax.crypto.spec.SecretKeySpec import javax.crypto.spec.IvParameterSpec import org.apache.commons.codec.binary.Base64 String aesKeyStr = vars.get("aes_key") String ivStr = vars.get("iv") String plainText = vars.get("plain_param") // 解析AES密钥和IV SecretKeySpec aesKey = new SecretKeySpec(Base64.decodeBase64(aesKeyStr), "AES") IvParameterSpec ivSpec = new IvParameterSpec(Base64.decodeBase64(ivStr)) // AES加密(算法/模式/填充必须和客户端完全匹配) Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") cipher.init(Cipher.ENCRYPT_MODE, aesKey, ivSpec) byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8")) String encryptedParam = Base64.encodeBase64String(encryptedBytes) // 存为变量供请求使用 vars.put("encrypted_param", encryptedParam)
3. 在HTTP请求中引用加密变量
把请求里需要传递加密值的参数,替换成脚本生成的变量(比如${encrypted_param}、${encrypted_aes_key}),参数名要和客户端请求完全一致。
关键注意点
- 加密参数必须和客户端对齐:包括算法(如RSA的填充方式、AES的模式)、编码(默认UTF-8)、IV生成逻辑(随机/固定),可以通过浏览器开发者工具查看客户端Jcryption源码确认。
- CSV数据集配置的变量名要和脚本中
${plain_param}对应,确保参数读取正常。
内容的提问来源于stack exchange,提问作者Mohamed Ariff
相关产品推荐
相关产品推荐

