温馨提示×

Linux Postman如何进行接口保护

小樊
45
2025-12-19 23:38:08
栏目: 智能运维

Linux下使用 Postman 进行接口保护的要点

Linux 桌面环境下,Postman 的接口保护主要围绕身份认证请求加密与签名敏感信息管理以及本地安全四个方面展开。下面给出可直接落地的做法与脚本示例。

一 身份认证与授权

  • 使用集合级授权统一配置,子请求可继承覆盖:在集合的 Authorization 中选择 Bearer Token、Basic Auth、Digest Auth、OAuth 1.0/2.0 等;协作时建议将 Token、密钥等放入变量而非明文保存,避免泄露。
  • 示例(Bearer Token):在 Tests 中提取并保存
    var jsonData = pm.response.json();
    pm.environment.set("myToken", jsonData.token || jsonData.access_token);
    
    之后在请求头中使用 {{myToken}}
  • Cookie 场景:登录后 Postman 会自动管理 Cookies,可在 Cookies 管理器中查看/添加,后续请求会自动携带。
  • 说明:Postman 提供 No Auth、Inherit auth from parent、Bearer Token、Basic Auth、Digest Auth、OAuth1.0、OAuth2.0 等类型,可按接口要求选择。

二 请求加密与签名

  • 参数加密(AES/RSA):在 Pre-request Script 中引入加密库并对参数加密,写入环境变量后在请求体/参数中使用 {{变量名}} 引用。
    • 示例(AES-CBC + PKCS7,CryptoJS):
      const CryptoJS = require("crypto-js");
      function aesEncrypt(content, key, iv) {
        const encrypted = CryptoJS.AES.encrypt(content, key, { iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
        return encrypted.toString();
      }
      const key = "Y5MUIOM7BUWI7BQR"; const iv = "S41AXIPFRFVJL73Z";
      pm.environment.set("encUser", aesEncrypt("admin", key, iv));
      
      请求体中使用 “username”:“{{encUser}}”
    • 示例(RSA,forge.js):
      if (!pm.globals.has("forgeJS")) {
        pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", (err, res) => {
          if (!err) pm.globals.set("forgeJS", res.text());
        });
      }
      eval(pm.globals.get("forgeJS"));
      function rsaEncrypt(content, pubKeyPem) {
        const pub = forge.pki.publicKeyFromPem(pubKeyPem);
        return forge.util.encode64(pub.encrypt(content, 'RSAES-PKCS1-V1_5', { md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create()) }));
      }
      pm.environment.set("encPwd", rsaEncrypt("P@ssw0rd", pm.globals.get("RSA_Public_Key")));
      
      请求体中使用 “password”:“{{encPwd}}”
  • 请求签名(SHA256withRSA 等):按服务端约定构造待签名串(常见包含 HTTP 方法、URL、时间戳、随机串、请求体),用私钥签名并放入请求头。
    // 假设已引入 pmlib(含 KJUR.crypto.Signature),私钥存于环境变量 pri_key
    eval(pm.globals.get('pmlib_code'));
    const privkey = pm.environment.get('pri_key').replace(/\\n/g, "\n");
    const dataToSign = pm.request.method + "\n" +
                      pm.request.url.getPathWithQuery() + "\n" +
                      pm.variables.replaceIn('{{$timestamp}}') + "\n" +
                      pm.variables.replaceIn('{{$randomUUID}}') + "\n" +
                      (pm.request.body?.raw || '');
    const sig = new pmlib.rs.KJUR.crypto.Signature({alg: "SHA256withRSA"});
    sig.init(privkey); sig.updateString(dataToSign);
    const signB64 = pmlib.rs.hextob64(sig.sign());
    pm.request.headers.add({ key: "Authorization", value: `SHA256-RSA nonce_str={{$randomUUID}},timestamp={{$timestamp}},signature=${signB64}` });
    
  • 参数签名(MD5 等):在 Pre-request 中拼接业务参数与盐/密钥后生成签名。
    const phone = "18211101111", opt = "testfan", ts = new Date().getTime();
    const sign = CryptoJS.MD5(phone + "your_salt" + ts).toString();
    pm.environment.set("phone", phone); pm.environment.set("opt", opt);
    pm.environment.set("timestamp", ts); pm.environment.set("sign", sign);
    
    请求体:
    { "phoneNum":"{{phone}}", "optCode":"{{opt}}", "timestamp":{{timestamp}}, "sign":"{{sign}}" }
    
  • 提示:Postman 的 request 对象在预请求脚本中为只读,通常通过“变量占位 + 前置脚本计算并回写变量”的方式实现加密/签名。

三 敏感信息与本地安全

  • 使用 环境变量/全局变量 管理 Token、密钥、盐 等敏感值,避免硬编码;协作时将敏感变量加入 Secret 类型或受控存储,减少泄露面。
  • 避免在脚本中打印或记录敏感信息;请求完成后可清理临时变量(如 pm.environment.unset("tmp"))。

四 快速落地清单

  • 在集合级设置 Authorization(如 Bearer/OAuth2),子请求按需继承或覆盖。
  • 登录后从响应提取 Token 存入变量,后续请求统一引用。
  • 对敏感参数在 Pre-request Script 中完成 AES/RSA 加密或 签名,请求体使用 {{变量}}
  • 对需要签名的接口,按约定构造待签名串,使用 SHA256withRSA 生成签名并写入 Authorization 头。
  • 全程使用变量管理密钥/盐/Token,避免明文与日志泄露;必要时在 Tests 中清理临时变量。

0