
前言也可以写python代码实现jwt鉴权和字段加密但是在jmeter中处理会比较麻烦所以选择用java实现相关参考链接AES 加密/解密 - 锤子在线工具JAVA实现RSA加密并在Jmeter/测试平台中调用 - 南北阡陌Jmeter接口测试AES加密-不引用外部jar包徒手实现AES加密_jmeter的aes-cbc模式本地加解密-CSDN博客1. JWT-java代码ai编写版本将以下代码编译后打一个jar包放置在Jmeter/ Lib/ext目录下通用版本ai生成版import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.*; import java.util.*; import java.util.Base64; public class JwtCode { /** * 生成通用 JWT Authorization * * param kid 可选的 Key ID用于标识签名密钥 * param privateKeyPem RSA 私钥支持 PKCS#1 / PKCS#8 * return Authorization Header 的值 */ public static String generateAuthorization( String kid, String privateKeyPem ) throws Exception { // // 1. Header // MapString, Object header new LinkedHashMap(); if (kid ! null !kid.isEmpty()) { header.put(kid, kid); } header.put(alg, RS256); header.put(typ, JWT); // // 2. Payload // long now System.currentTimeMillis() / 1000L; MapString, Object payload new LinkedHashMap(); payload.put(iat, now); payload.put(exp, now 5 * 60); // // 3. Base64URL 编码 // String encodedHeader base64UrlEncode( toJson(header).getBytes(StandardCharsets.UTF_8) ); String encodedPayload base64UrlEncode( toJson(payload).getBytes(StandardCharsets.UTF_8) ); // JWT Signing Input String signingInput encodedHeader . encodedPayload; // // 4. 加载 RSA 私钥 // PrivateKey privateKey loadPrivateKey(privateKeyPem); // // 5. RS256 签名 // byte[] signature sign( privateKey, signingInput.getBytes(StandardCharsets.UTF_8) ); String encodedSignature base64UrlEncode(signature); // // 6. 生成 JWT // String jwt signingInput . encodedSignature; return Bearer jwt; } /** * RS256 SHA256withRSA */ private static byte[] sign( PrivateKey privateKey, byte[] data ) throws Exception { Signature signature Signature.getInstance(SHA256withRSA); signature.initSign(privateKey); signature.update(data); return signature.sign(); } /** * Base64URL 编码 */ private static String base64UrlEncode(byte[] bytes) { return Base64 .getUrlEncoder() .withoutPadding() .encodeToString(bytes); } /** * 加载 RSA 私钥 * * 支持 * PKCS#8 * -----BEGIN PRIVATE KEY----- * * PKCS#1 * -----BEGIN RSA PRIVATE KEY----- */ private static PrivateKey loadPrivateKey( String pem ) throws Exception { String cleanPem pem .replace(-----BEGIN PRIVATE KEY-----, ) .replace(-----END PRIVATE KEY-----, ) .replace(-----BEGIN RSA PRIVATE KEY-----, ) .replace(-----END RSA PRIVATE KEY-----, ) .replaceAll(\\s, ); byte[] keyBytes Base64.getDecoder().decode(cleanPem); // 尝试 PKCS#8 try { KeyFactory keyFactory KeyFactory.getInstance(RSA); return keyFactory.generatePrivate( new PKCS8EncodedKeySpec(keyBytes) ); } catch (Exception e) { // 尝试 PKCS#1 return readPkcs1PrivateKey(keyBytes); } } /** * PKCS#1 RSA 私钥转换为 PKCS#8 */ private static PrivateKey readPkcs1PrivateKey( byte[] pkcs1Bytes ) throws Exception { final byte[] pkcs8Header new byte[]{ 0x30, (byte) 0x82, (byte) ((pkcs1Bytes.length 22) 8), (byte) ((pkcs1Bytes.length 22) 0xff), 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a, (byte) 0x86, 0x48, (byte) 0x86, (byte) 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, (byte) 0x82, (byte) (pkcs1Bytes.length 8), (byte) (pkcs1Bytes.length 0xff) }; byte[] pkcs8Bytes new byte[ pkcs1Bytes.length pkcs8Header.length ]; System.arraycopy( pkcs8Header, 0, pkcs8Bytes, 0, pkcs8Header.length ); System.arraycopy( pkcs1Bytes, 0, pkcs8Bytes, pkcs8Header.length, pkcs1Bytes.length ); KeyFactory keyFactory KeyFactory.getInstance(RSA); return keyFactory.generatePrivate( new PKCS8EncodedKeySpec(pkcs8Bytes) ); } /** * 简单 JSON 序列化 * * 本示例仅用于演示 JWT。 */ private static String toJson( MapString, Object map ) { StringBuilder sb new StringBuilder({); IteratorMap.EntryString, Object iterator map.entrySet().iterator(); while (iterator.hasNext()) { Map.EntryString, Object entry iterator.next(); sb.append(\) .append(entry.getKey()) .append(\:); Object value entry.getValue(); if (value instanceof Number) { sb.append(value); } else { sb.append(\) .append(value) .append(\); } if (iterator.hasNext()) { sb.append(,); } } sb.append(}); return sb.toString(); } }2. AES请求字段加密同理让AI帮忙生成代码编译成jar包即可3. jar包——4.JSR223 PreProcessor用法将以下代码放置到Jmeter -JSR223 PreProcessor中即可加密请求字段后获取对应的请求字段:import org.example.*; //导入实现加密的jar包复制到jmeter前置处理器把注释删掉否则会报错 import java.time.Instant; import java.util.Map; //String 代码需要的参数名 vars.get(jmeter设置的需要加密/处理的参数); String originalData vars.get(data); String timeStamp vars.get(timestamp); String pemPubKey vars.get(public_key); Map rets AESUtils.encData(originalData, timeStamp, pemPubKey);//使用自定义的里面的函数获取返回值 //vars.put(最后在jmeter使用的参数名),rets.get(代码输出到对应的参数名))) vars.put(data,rets.get(data)); vars.put(timestamp,rets.get(timestamp)); vars.put(enc_key,rets.get(enc_key)); vars.put(pub_key_hash,rets.get(pub_key_hash)); vars.put(final_nonce,rets.get(nonce));获取当前Request bodyimport org.apache.jmeter.config.Arguments; import java.util.Map; Arguments args sampler.getArguments(); Map reqMap args.getArgumentsAsMap(); StringBuilder bodyBuilder new StringBuilder(); for (String key : reqMap.keySet()) { Object value reqMap.get(key); log.info(String.valueOf(value)); if (key ! null key.length() 0) { bodyBuilder.append(key).append().append(value); } else { bodyBuilder.append(value); } } String requestBody bodyBuilder.toString(); vars.put(request_body, requestBody);获取到的当前请求body 调用jar包Jwt加密后的到Authorizationimport org.example.JwtCode; String privateKeyPem vars.get(privateKeyPem); // JWT需要的参数根据实际情况填入参数 String auth JwtCode.generateAuthorization( null, privateKeyPem ); vars.put(Authorization, auth); //JWT加密后的到的鉴权参数经由vars.put获取到的参数可以直接被调用放到请求头/请求body里面例如