如何在Postman中实现RSA加密自动化测试REST API?
在Postman中实现RSA加密自动化的解决方案
嘿,这个问题我之前也碰到过!确实Postman自带的crypto-js库不支持RSA加密,但好在Postman的脚本环境支持Web Crypto API(和现代浏览器里的API一致),完全可以用它来实现RSA加密的自动化。下面是贴合你需求的完整流程:
步骤1:调用公钥API并存储公钥到变量
首先发送获取RSA公钥的请求,在该请求的Tests标签页中编写脚本,把返回的公钥提取出来,存储到环境变量或全局变量中。
假设你的公钥API返回的JSON结构是这样的:
{ "publicKey": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...\n-----END PUBLIC KEY-----" }
对应的Tests脚本:
// 从响应中提取PEM格式的公钥 const publicKeyPem = pm.response.json().publicKey; // 存储到环境变量(也可以用pm.globals.set存全局变量) pm.environment.set("rsa_public_key", publicKeyPem);
步骤2:编写RSA加密函数并加密目标值
在需要加密字段的请求的Pre-request Script标签页中,编写异步加密函数,利用Web Crypto API完成加密,并把加密结果存储到变量中供请求使用。
完整的Pre-request Script代码
async function rsaEncrypt(publicKeyPem, plainText) { // 处理PEM格式:去掉首尾标记和换行符 const publicKeyContent = publicKeyPem .replace(/-----BEGIN PUBLIC KEY-----/, '') .replace(/-----END PUBLIC KEY-----/, '') .replace(/\n/g, ''); // 将Base64字符串解码为ArrayBuffer const publicKeyBuffer = Uint8Array.from(atob(publicKeyContent), c => c.charCodeAt(0)).buffer; // 导入公钥到Web Crypto,算法根据API要求调整(这里用RSA-OAEP) const publicKey = await crypto.subtle.importKey( "spki", // 公钥格式:SPKI(对应PEM公钥) publicKeyBuffer, { name: "RSA-OAEP", hash: "SHA-256" // 哈希算法,需和API要求一致 }, false, // 是否允许导出密钥(不需要的话设为false) ["encrypt"] // 密钥用途:仅加密 ); // 将明文转换为UTF-8编码的Uint8Array const plainTextBuffer = new TextEncoder().encode(plainText); // 执行加密 const encryptedBuffer = await crypto.subtle.encrypt( { name: "RSA-OAEP" }, publicKey, plainTextBuffer ); // 将加密后的ArrayBuffer转换为Base64字符串(方便后续请求使用) return btoa(String.fromCharCode(...new Uint8Array(encryptedBuffer))); } // 执行加密逻辑 (async () => { // 从环境变量获取存储的公钥 const publicKey = pm.environment.get("rsa_public_key"); // 替换成你需要加密的目标字段值 const valueToEncrypt = "your_target_value"; // 执行加密 const encryptedValue = await rsaEncrypt(publicKey, valueToEncrypt); // 把加密结果存到环境变量 pm.environment.set("encrypted_field", encryptedValue); })();
步骤3:在请求中引用加密后的变量
最后,在需要提交加密字段的请求Body中,直接引用刚才存储的变量即可,比如:
{ "encrypted_field": "{{encrypted_field}}" }
关键注意事项
- 算法匹配:如果你的API要求使用
RSA-PKCS1-v1_5(而非RSA-OAEP),只需修改函数中的算法参数:导入密钥和加密时的name改为"RSA-PKCS1-v1_5"即可。 - 公钥格式:如果API返回的是JWK格式的公钥,可直接在
importKey时指定格式为"jwk",无需处理PEM的步骤。 - 异步处理:Web Crypto的所有操作都是异步的,必须用
async/await或Promise.then()处理,否则会拿到未解析的Promise对象。 - 编码一致性:确保明文的编码(这里用UTF-8)和API要求的一致,避免乱码问题。
内容的提问来源于stack exchange,提问作者mad_fox




