centos

centos环境postman如何加密数据

小樊
40
2025-12-27 03:40:27
栏目: 网络安全

CentOS下Postman加密数据实操指南

一 基础安全配置

二 请求数据的加密与签名

三 示例脚本

// Pre-request Script
const forgeUrl = 'https://lzq1357.gitee.io/various/forge_min.js';

if (!pm.globals.has('forgeJS')) {
  pm.sendRequest(forgeUrl, (err, res) => {
    if (err) return console.error('forge.js 加载失败', err);
    pm.globals.set('forgeJS', res.text());
    runEncrypt(); // 首次加载后递归执行
  });
  return;
}
eval(pm.globals.get('forgeJS')); // 注入 forge

function rsaEncrypt(content, pem) {
  const pub = forge.pki.publicKeyFromPem(pem);
  return forge.util.encode64(pub.encrypt(content, 'RSAES-PKCS1-V1_5', {
    md: forge.md.sha256.create(),
    mgf1: { md: forge.md.sha1.create() }
  }));
}

function runEncrypt() {
  const pubKey = `-----BEGIN PUBLIC KEY-----\n${pm.environment.get('rsa_pub_key')}\n-----END PUBLIC KEY-----`;
  const pwd = pm.environment.get('raw_password'); // 原始密码
  const enc = rsaEncrypt(pwd, pubKey);
  pm.environment.set('password_enc', enc); // 在 Body/Header 中使用 {{password_enc}}
}

要点:公钥放在环境变量rsa_pub_key,明文密码放在raw_password,加密结果放入password_enc后在请求中使用。

// Pre-request Script
const CryptoJS = require('crypto-js');

function aesEncrypt(plaintext, key, iv) {
  const k = CryptoJS.enc.Utf8.parse(key);     // 16/24/32 字节
  const i = CryptoJS.enc.Utf8.parse(iv);     // 16 字节
  const enc = CryptoJS.AES.encrypt(plaintext, k, {
    iv: i,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return enc.toString(); // Base64
}

if (pm.request.method === 'POST' && pm.environment.get('env') === 'product') {
  const key = pm.environment.get('aes_key');   // 16/24/32 字节
  const iv  = pm.environment.get('aes_iv');    // 16 字节
  const body = pm.request.body.raw;
  const encBody = aesEncrypt(body, key, iv);
  pm.request.body.raw = encBody; // 替换原请求体
}

要点:密钥/向量与后端保持一致;CBC 模式需提供IV;加密后直接替换request.body.raw

// Pre-request Script
const CryptoJS = require('crypto-js');

const appKey  = pm.environment.get('appKey');
const secret  = pm.environment.get('appSecret');
const ts      = Date.now().toString();
const method  = pm.request.method.toUpperCase();
const urlPath = pm.request.url.getPath(); // 不含域名与查询串

// 计算 body 摘要(注意与后端一致:是否排序键、是否转义、是否去空格)
const bodyRaw = pm.request.body.raw || '';
const bodyMd5 = CryptoJS.MD5(bodyRaw).toString();

// 拼接待签名串(示例规则,需与后端一致)
let signStr = appSecret + method + urlPath + ts + bodyMd5 + appSecret;
const sign    = CryptoJS.HmacSHA256(signStr, secret).toString(CryptoJS.enc.Hex);

pm.environment.set('timestamp', ts);
pm.environment.set('sign', sign);
// 在请求头中使用:例如 Authorization: Bearer {{sign}} 或自定义 X-Signature: {{sign}}

要点:签名串的字段顺序、编码、是否包含 query、是否对 body 做 MD5等必须与后端约定一致。

四 常见问题与排查

0
看了该问题的人还看了