You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
注册

如何在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/awaitPromise.then()处理,否则会拿到未解析的Promise对象。
  • 编码一致性:确保明文的编码(这里用UTF-8)和API要求的一致,避免乱码问题。

内容的提问来源于stack exchange,提问作者mad_fox

火山引擎 最新活动