Jmeter-JSR233 PreProcessor-调用jar包-实现JWT鉴权  AES加密-将输出字段返回至请求body
前言也可以写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里面例如

相关新闻

04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构

04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构

Dictionary<TKey,TValue>&#xff08;上&#xff09;&#xff1a;核心数据结构 系列&#xff1a;C#与常用数据结构源码剖析 数据结构-哈希与映射篇 阅读时间&#xff1a;约 55 分钟 源码位置&#xff1a;dotnet/runtime5535e31.../Dictionary.cs 版本边界&#xff1a;以…

2026/11/9 10:58:10 阅读更多 →
04-03-哈希-Dictionary-TKey-TValue-下-关键操作逐行分析

04-03-哈希-Dictionary-TKey-TValue-下-关键操作逐行分析

Dictionary<TKey,TValue>&#xff08;下&#xff09;&#xff1a;关键操作逐行分析 系列&#xff1a;C# 与常用数据结构源码剖析 数据结构—哈希与映射篇 源码入口&#xff1a;dotnet/runtime/src/libraries/System.Private.CoreLib/src/System/Collections/Generic/Dic…

2026/11/11 20:19:37 阅读更多 →
悬疑反转短剧制作教程:用知漫剧打造高完播率的惊悚悬疑漫剧

悬疑反转短剧制作教程:用知漫剧打造高完播率的惊悚悬疑漫剧

惊悚悬疑漫剧常面临氛围难烘托与人物变脸等痛点。作为AI模型聚合平台&#xff0c;工具整合站点知漫剧( tt.jiaxunai.cn) 针对小白提供超低价一键式生成与专业指导&#xff0c;教你快速打造高完播率短剧。 行业常见痛点&#xff1a;悬疑反转漫剧制作中的“氛围拉胯”与“角色跑戏…

2026/11/5 18:40:54 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年&#xff0c;我大部分时间都在跟浏览器标签页打交道&#xff0c;直到第一次把桌面应用跑起来&#xff0c;才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词&#xff0c;最开始是在某段时间频繁出现在同事的讨论里&#xff0c;一个用HTML…

2026/11/13 5:13:25 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档&#xff0c;主要面向智能锁安装人员、终端用户及售后维护者&#xff0c;帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件&#xff0c;大小4.37MB&#xff0c;内容结构清晰&#xff…

2026/11/13 5:13:25 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统&#xff0c;整车要求空载跑到8m/s&#xff0c;电机转速已经拉到额定点&#xff0c;驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令&#xff0c;转速纹丝不动&#xff0c;三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/13 5:13:25 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年&#xff0c;用它写过嵌入式驱动、做过游戏服务端&#xff0c;也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词&#xff0c;我其实挺感慨的——这门语言的难点从来不是语法多&#xff0c;而是知识点之间的耦合太深…

2026/11/13 22:08:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介&#xff1a;亚太天能T109滑盖智能锁产品说明书以PDF格式发布&#xff0c;适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开&#xff0c;先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能&#xff0c;再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历&#xff1a;翻开源码注释、论文摘要或者一份专业报告&#xff0c;每个字都认识&#xff0c;连在一起却像天书。想找人聊聊&#xff0c;身边要么没人懂&#xff0c;要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型&#xff0c;几秒钟之后&a…

2026/11/13 5:13:25 阅读更多 →

日新闻

周新闻

月新闻