当前位置: 首页 > article >正文

Postman Pre-request Script实战:用forgeJS实现RSA加解密(附完整代码)

Postman Pre-request Script实战用forgeJS实现RSA加解密附完整代码在API开发和测试过程中数据安全传输是至关重要的环节。RSA非对称加密算法因其安全性高、密钥管理方便等特点成为API接口加密的常见选择。然而许多开发者在使用Postman进行接口测试时常常遇到一个棘手问题Postman内置的JavaScript环境并不直接支持RSA加解密操作。本文将带你深入探索如何通过forgeJS库在Postman的Pre-request Script中实现完整的RSA加解密流程解决实际测试工作中的加密需求。1. 为什么需要在Postman中实现RSA加解密现代API接口越来越重视数据传输的安全性。特别是在金融、医疗、电商等领域敏感数据的传输必须经过加密处理。RSA算法因其非对称特性能够很好地解决密钥分发问题公钥加密任何人都可以用公钥加密数据但只有持有私钥的一方才能解密私钥签名持有私钥的一方可以对数据进行签名其他人可以用公钥验证签名真实性在Postman测试这类加密接口时开发者面临的主要挑战包括无法直接生成符合要求的加密参数难以验证服务端返回的加密数据手动加密效率低下影响测试效率通过Pre-request Script自动完成加密过程可以显著提升测试效率和准确性。下面是一个典型的RSA加密接口测试流程对比测试方式准备时间准确性可维护性手动加密长低差Pre-request Script短高好2. forgeJS库的引入与初始化Postman的JavaScript环境基于Node.js但移除了很多内置模块包括加密相关功能。forgeJS是一个纯JavaScript实现的加密库完美适配Postman环境。以下是引入forgeJS的完整方案// 检查是否已加载forgeJS if (!pm.globals.has(forgeJS)) { pm.sendRequest({ url: https://cdn.jsdelivr.net/npm/node-forge1.3.1/dist/forge.min.js, method: GET }, (err, res) { if (!err) { // 将库代码存入全局变量 pm.globals.set(forgeJS, res.text()); console.log(forgeJS加载完成); executeCryptoOperations(); // 执行加密操作 } else { console.error(加载forgeJS失败:, err); } }); } else { executeCryptoOperations(); // 如果已加载直接执行 }提示建议使用jsdelivr等CDN地址获取forgeJS确保加载速度和稳定性。全局变量存储可以避免每次请求重复加载。3. RSA密钥的生成与管理在实际项目中RSA密钥对通常由后端生成并提供公钥给前端。但在测试环境中我们可能需要自己生成密钥对。以下是使用forgeJS生成RSA密钥对的完整代码function generateRSAKeyPair() { const bits 2048; // 密钥长度 const keypair forge.pki.rsa.generateKeyPair({bits: bits}); // 获取PEM格式的公私钥 const publicKey forge.pki.publicKeyToPem(keypair.publicKey); const privateKey forge.pki.privateKeyToPem(keypair.privateKey); return { publicKey: publicKey, privateKey: privateKey }; } // 示例密钥对 const keys generateRSAKeyPair(); console.log(公钥:\n, keys.publicKey); console.log(私钥:\n, keys.privateKey);密钥管理的最佳实践将公钥存储在Postman的环境变量中方便团队共享私钥应妥善保管建议使用Postman的secret变量功能定期轮换测试用的密钥对模拟生产环境的安全策略4. 完整RSA加解密实现下面我们实现一个完整的RSA加解密流程包括数据准备、加密、解密和结果验证function executeCryptoOperations() { // 引入forge库 eval(pm.globals.get(forgeJS)); // 准备测试数据 const testData { timestamp: new Date().getTime(), userId: test_user_001, action: query_balance }; // 从环境变量获取密钥 const publicKey pm.environment.get(RSA_PUBLIC_KEY); const privateKey pm.variables.get(RSA_PRIVATE_KEY); // 1. 数据序列化 const jsonString JSON.stringify(testData); // 2. RSA加密 const encryptedData (function() { const publicKeyObj forge.pki.publicKeyFromPem(publicKey); const encryptedBytes publicKeyObj.encrypt( forge.util.encodeUtf8(jsonString), RSA-OAEP, { md: forge.md.sha256.create(), mgf1: { md: forge.md.sha256.create() } } ); return forge.util.encode64(encryptedBytes); })(); // 3. RSA解密 const decryptedData (function() { const privateKeyObj forge.pki.privateKeyFromPem(privateKey); const decryptedBytes privateKeyObj.decrypt( forge.util.decode64(encryptedData), RSA-OAEP, { md: forge.md.sha256.create(), mgf1: { md: forge.md.sha256.create() } } ); return forge.util.decodeUtf8(decryptedBytes); })(); // 验证结果 console.log(原始数据:, jsonString); console.log(加密结果:, encryptedData); console.log(解密结果:, decryptedData); // 更新请求体 pm.request.body.update({ mode: raw, raw: JSON.stringify({data: encryptedData}) }); }关键点解析加密模式使用RSA-OAEP填充方案比PKCS#1 v1.5更安全哈希算法统一使用SHA-256确保一致性错误处理实际项目中应添加try-catch块处理可能的加解密异常性能优化大数据量时应考虑分段加密或改用对称加密5. 高级应用场景掌握了基础加解密后我们可以扩展更多实用场景5.1 接口签名验证function generateSignature(data, privateKey) { const privateKeyObj forge.pki.privateKeyFromPem(privateKey); const md forge.md.sha256.create(); md.update(data, utf8); return forge.util.encode64( privateKeyObj.sign(md) ); } function verifySignature(data, signature, publicKey) { const publicKeyObj forge.pki.publicKeyFromPem(publicKey); const md forge.md.sha256.create(); md.update(data, utf8); return publicKeyObj.verify( md.digest().bytes(), forge.util.decode64(signature) ); }5.2 加密参数自动处理// 自动加密所有标有#encrypt的参数 const body pm.request.body.urlencoded; body.each(param { if (param.key.endsWith(#encrypt)) { const originalKey param.key.replace(#encrypt, ); const encryptedValue rsaEncrypt(param.value, publicKey); body.upsert({ key: originalKey, value: encryptedValue }); body.remove(param); } });5.3 测试数据加密工厂function createEncryptedTestData(template) { const result {}; for (const key in template) { if (typeof template[key] object) { result[key] createEncryptedTestData(template[key]); } else { result[key] rsaEncrypt( template[key], pm.environment.get(RSA_PUBLIC_KEY) ); } } return result; } // 使用示例 const testTemplate { user: { id: U10001, name: 测试用户 }, order: { id: O20002, amount: 100.00 } }; const encryptedData createEncryptedTestData(testTemplate);6. 常见问题与调试技巧在实际使用过程中可能会遇到各种问题。以下是几个常见问题及解决方法密钥格式错误确保PEM格式正确包含完整的BEGIN/END标记检查密钥是否包含不可见字符数据长度限制// RSA加密的最大数据长度计算 const maxLength (keySize / 8) - 42; // OAEP填充 console.log(最大加密长度:, maxLength);性能优化对于大数据量先使用AES加密数据再用RSA加密AES密钥缓存密钥对象避免重复解析PEM编码问题确保加密前后使用相同的编码(UTF-8)Base64编码使用forge.util.encode64/decode64调试建议使用Postman的Console面板查看详细日志分步验证先测试密钥加载再测试加解密对比其他平台的加密结果确保一致性// 调试示例 function debugEncrypt(data) { const step1 forge.util.encodeUtf8(data); console.log(Step1 - UTF8编码:, step1.length); const step2 publicKey.encrypt(step1); console.log(Step2 - 加密后:, step2.length); const step3 forge.util.encode64(step2); console.log(Step3 - Base64:, step3.length); return step3; }7. 安全最佳实践在测试环境中同样需要重视安全密钥存储公钥可以存储在环境变量中私钥应使用Postman的Secret类型变量避免在代码中硬编码密钥请求安全为加密请求添加时间戳和nonce防止重放攻击敏感参数即使加密也应避免通过URL传递日志控制// 生产模式关闭敏感日志 if (pm.environment.get(ENV_MODE) ! production) { console.log(敏感数据:, data); }定期更新关注forgeJS的安全更新定期更换测试密钥对及时更新Postman到最新版本8. 完整代码整合将所有功能整合成一个完整的Pre-request Script示例try { // 加载forgeJS if (!pm.globals.has(forgeJS)) { pm.sendRequest({ url: https://cdn.jsdelivr.net/npm/node-forge1.3.1/dist/forge.min.js, method: GET }, (err, res) { if (!err) { pm.globals.set(forgeJS, res.text()); main(); } else { throw new Error(加载forgeJS失败); } }); } else { main(); } function main() { eval(pm.globals.get(forgeJS)); // 配置 const config { algorithm: RSA-OAEP, hash: forge.md.sha256.create(), label: null }; // 获取密钥 const publicKey pm.environment.get(RSA_PUBLIC_KEY); const privateKey pm.variables.get(RSA_PRIVATE_KEY); // 准备请求数据 const requestData prepareRequestData(); // 加密数据 const encryptedData rsaEncrypt( JSON.stringify(requestData), publicKey, config ); // 设置请求头 pm.request.headers.upsert({ key: X-Encrypted-Data, value: true }); // 更新请求体 pm.request.body.update({ mode: raw, raw: JSON.stringify({ data: encryptedData, timestamp: new Date().getTime() }) }); } function prepareRequestData() { // 从请求参数收集数据 const params pm.request.url.query.toObject(); const body pm.request.body.toObject(); return { ...params, ...body, nonce: generateNonce() }; } function generateNonce() { return forge.util.bytesToHex(forge.random.getBytes(16)); } function rsaEncrypt(data, publicKey, config) { const publicKeyObj forge.pki.publicKeyFromPem(publicKey); const encryptedBytes publicKeyObj.encrypt( forge.util.encodeUtf8(data), config.algorithm, { md: config.hash, mgf1: { md: config.hash }, label: config.label } ); return forge.util.encode64(encryptedBytes); } } catch (error) { console.error(Pre-request Script错误:, error); throw error; }这个完整实现包含了异常处理、请求数据处理、加密配置等生产级功能可以直接用于实际项目测试。根据具体需求可以进一步扩展或调整各部分功能。

相关文章:

Postman Pre-request Script实战:用forgeJS实现RSA加解密(附完整代码)

Postman Pre-request Script实战:用forgeJS实现RSA加解密(附完整代码) 在API开发和测试过程中,数据安全传输是至关重要的环节。RSA非对称加密算法因其安全性高、密钥管理方便等特点,成为API接口加密的常见选择。然而&a…...

376.2协议帧结构深度解析:从控制域到数据单元的通信密码

1. 376.2协议帧结构全景图 当你第一次看到376.2协议的报文时,可能会被那一串十六进制数字搞得头晕眼花。别担心,这就像拆解乐高积木一样,只要掌握每个模块的作用,就能看懂这个"通信密码本"。整个帧结构就像快递包裹&…...

基于Matlab/Simulink的光伏电池H6型逆变器仿真建模

Simulink仿真:基于Matlab/Simulink的H6光伏逆变器仿真建模 关键词:光伏电池 Matlab/Simulink 仿真建模 参考文献:自建实验文档(数据和图可直接使用) 仿真平台:MATLAB/Simulink 主要内容:本文基于…...

银河麒麟系统下miniconda安装避坑指南

1. 银河麒麟系统安装miniconda的常见问题 第一次在银河麒麟系统上安装miniconda时,我遇到了一个让人头疼的错误。执行安装脚本后,终端突然弹出一堆红色报错信息,最后以"Permission denied"结束。这种情况在Linux系统中很常见&#…...

跨设备共享Ollama本地AI模型:局域网配置全攻略

1. 为什么需要跨设备共享Ollama服务? 最近两年本地AI模型越来越火,很多开发者都在自己的电脑上跑起了Llama、Mistral这样的开源大模型。但每次想用手机或者平板访问时,都得重新部署一遍,特别麻烦。我自己就经常遇到这种情况&#…...

Rolldown构建性能基准测试:量化评估优化效果

Rolldown构建性能基准测试:量化评估优化效果 【免费下载链接】rolldown Modern bundler built on Rollup with couple more features, such as multiple entry points, presets, better configuration experience and more. 项目地址: https://gitcode.com/GitHub…...

向量+关键词+图谱三路召回协同失效?Dify 0.12+最新混合策略调优全链路,含可复用YAML配置模板

第一章:Dify 混合 RAG 召回率优化 安全性最佳方案在 Dify 平台中构建混合 RAG(Retrieval-Augmented Generation)系统时,召回率与安全性并非互斥目标——通过语义分层召回、动态权限过滤与内容可信度校验三重机制,可同步…...

Initia桌面应用:Electron与Tauri桌面钱包终极指南

Initia桌面应用:Electron与Tauri桌面钱包终极指南 【免费下载链接】initia 项目地址: https://gitcode.com/GitHub_Trending/in/initia Initia是一款功能强大的开源项目,提供了基于Electron与Tauri框架的桌面钱包解决方案,帮助用户安…...

绍兴:“空中尖兵”护航平安高速路

在浙江绍兴的高速公路上,一群特殊的“交警”正全天候守护着道路安全——它们不是真人,却能在3分钟内飞抵事故现场,实现“秒级发现、分钟级干预”。这就是浙江省绍兴市公安局打造的“铁翼战队”,一支警用无人机集群。针对高速公路二…...

从电磁波反射到信号衰减:一文读懂PCB过孔stub的那些事儿

从电磁波反射到信号衰减:一文读懂PCB过孔stub的那些事儿 走在城市的高楼之间,你是否注意过声音的奇妙反射现象?一声呼喊在建筑墙面间来回反弹,形成清晰可辨的回声。这种波动反射的物理现象,与PCB设计中高频信号遇到的过…...

手机拍照为啥总翻车?一文看懂ISP芯片如何拯救你的废片

手机拍照为啥总翻车?一文看懂ISP芯片如何拯救你的废片 每次拍完照片查看相册时,是否常遇到这些崩溃瞬间?夜景模式拍出的灯光全是模糊光斑,逆光下的人脸黑得像剪影,餐厅暖光让食物颜色失真发黄…这些翻车现场背后&#…...

【软件工程】从伪码到蓝图:PDL语言如何重塑软件设计规约

1. 当伪码遇上工程:PDL语言的诞生背景 我第一次接触PDL语言是在2013年参与银行核心系统重构时。当时团队里资深架构师扔给我一份满是英文关键词夹杂中文注释的文档,看着像代码却又不能直接执行。他告诉我:"这是用PDL写的设计规约&#x…...

从零实现ResNet50:PyTorch实战与鸟类图像分类应用

1. ResNet50网络结构解析 ResNet50作为深度学习中里程碑式的网络架构,其核心创新点在于残差连接(Residual Connection)的设计。我第一次接触这个结构时,被它的简洁和高效深深震撼。想象一下,当你在搭建一个超深的神经网…...

王者荣耀图鉴国际化:wzry项目i18n集成实践

王者荣耀图鉴国际化:wzry项目i18n集成实践 【免费下载链接】wzry 🌈基于 Vue3TypescriptVite4Pinia2 的王者荣耀图鉴 🚀 项目地址: https://gitcode.com/GitHub_Trending/wz/wzry 在Vue3TypescriptVite4Pinia2技术栈构建的王者荣耀图鉴…...

视觉SLAM翻车现场自救手册:用深度强化学习解决特征点丢失的5个技巧

深度强化学习在视觉SLAM特征点稳定中的应用实践 视觉SLAM技术在实际应用中常面临特征点丢失的挑战,尤其是在低纹理或动态环境中。传统方法如DWA、TEB等局部路径规划算法虽然能解决部分避障问题,但对特征点稳定性关注不足。本文将分享如何通过深度强化学习…...

Initia GraphQL:为交织Rollup网络提供强大数据查询接口的终极指南

Initia GraphQL:为交织Rollup网络提供强大数据查询接口的终极指南 【免费下载链接】initia 项目地址: https://gitcode.com/GitHub_Trending/in/initia Initia GraphQL接口是为Initia区块链生态系统设计的强大数据查询解决方案,专门优化了交织Ro…...

选对服务器,OpenClaw快速部署不踩坑,蓝队云2H4G配置首选

OpenClaw(“龙虾”)的崛起,让更多人意识到AI智能体的强大,它无需安装额外APP,可集成在微信、飞书等常用通讯软件中,随时响应指令、自主完成任务,而要实现这一切,前提是完成OpenClaw快…...

频率主义 vs 贝叶斯主义中的态、势、感、知

频率主义视参数为固定客观常数、概率为长期频率,侧重用客观数据估计检验;贝叶斯主义视参数为随机概率分布、概率为主观信念度,侧重用先验与新数据更新信念。在统计学和概率哲学中,频率主义(Frequentism)与贝…...

GME多模态向量-Qwen2-VL-2B基础教程:Sentence Transformers微调入门指南

GME多模态向量-Qwen2-VL-2B基础教程:Sentence Transformers微调入门指南 1. 学习目标与前置知识 如果你正在寻找一个能够同时处理文本、图像和图文对的多模态向量模型,那么GME多模态向量-Qwen2-VL-2B绝对值得你深入了解。这个模型不仅能生成统一的向量…...

弦音墨影创意作品集:基于Transformer架构的古典诗词生成效果展示

弦音墨影创意作品集:基于Transformer架构的古典诗词生成效果展示 古典诗词,作为中华文化宝库中的璀璨明珠,其创作向来被视为需要深厚学养与灵感的艺术。如今,借助弦音墨影这样基于Transformer架构的大模型,我们似乎找…...

pdf2htmlEX安全审计清单:全面检查安全漏洞的项目

pdf2htmlEX安全审计清单:全面检查安全漏洞的项目 【免费下载链接】pdf2htmlEX Convert PDF to HTML without losing text or format. 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2htmlEX pdf2htmlEX是一款能够将PDF文件转换为HTML格式同时保持文本和格…...

ESP32 SDK开发实战:晶振与Flash配置优化全攻略

1. 为什么需要关注晶振与Flash配置? 刚接触ESP32开发时,很多人容易忽略硬件配置的重要性。我见过不少开发者拿着新买的开发板直接烧录示例代码,结果串口输出乱码、程序运行异常,折腾半天才发现是晶振频率没配对。还有更隐蔽的问题…...

BabelDOC:双语文档生成的智能解决方案

BabelDOC:双语文档生成的智能解决方案 【免费下载链接】BabelDOC Yet Another Document Translator 项目地址: https://gitcode.com/GitHub_Trending/ba/BabelDOC 如何快速搭建PDF翻译环境?零基础入门指南 当你收到一份英文技术文档需要快速生成…...

微信小程序集成Granite TimeSeries FlowState R1:实现移动端销量预测工具

微信小程序集成Granite TimeSeries FlowState R1:实现移动端销量预测工具 最近和几个做零售的朋友聊天,他们都在头疼同一个问题:怎么才能更准地知道明天、下周该进多少货?备多了压资金,备少了又丢生意。传统的经验判断…...

Qwen3-ASR-1.7B性能优化:基于CUDA的GPU加速实践

Qwen3-ASR-1.7B性能优化:基于CUDA的GPU加速实践 语音识别模型在实际应用中往往面临推理速度的挑战,尤其是在处理长音频或高并发请求时。Qwen3-ASR-1.7B作为一款优秀的语音识别模型,通过GPU加速可以显著提升推理效率。今天咱们就来聊聊如何用…...

MSP432P401R开发实战:CCS环境配置全攻略

1. 从零开始搭建MSP432开发环境 第一次接触MSP432P401R这块开发板时,我和大多数新手一样,以为只要安装好CCS软件就能直接开撸代码。结果新建工程后连最基本的GPIO控制都报错,这才意识到环境配置的重要性。经过几次踩坑,我总结出这…...

March7thAssistant:星穹铁道自动化工具的技术架构与实战指南

March7thAssistant:星穹铁道自动化工具的技术架构与实战指南 【免费下载链接】March7thAssistant 🎉 崩坏:星穹铁道全自动 Honkai Star Rail 🎉 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 在《崩坏&…...

Qwen-Ranker Pro与MySQL数据库集成:实现智能语义搜索

Qwen-Ranker Pro与MySQL数据库集成:实现智能语义搜索 1. 引言 想象一下这样的场景:你的电商平台有数百万商品,用户搜索"适合夏天穿的轻薄透气运动鞋",传统的关键词搜索可能返回一堆包含"夏天"、"轻薄&…...

手把手教你用IndexTTS2 V23版:从安装到生成情感语音全流程

手把手教你用IndexTTS2 V23版:从安装到生成情感语音全流程 1. 快速部署IndexTTS2 V23版 1.1 环境准备与系统要求 在开始使用IndexTTS2 V23版之前,请确保您的系统满足以下最低配置要求: 操作系统:推荐使用Ubuntu 20.04或更高版…...

IEEE33节点系统Simulink仿真结构](仿真图链接

基于IEEE33节点系统电动汽车充电对配电网节点电压偏差的影响 给出IEEE33节电系统在一个时刻下接入电动汽车充电负荷后的Simulink仿真图,其他不同时刻接入不同的EV充电负荷自己去做(这些也是为了得到后面的mat参数文件),但不同时刻…...