You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 23:33:27