ubuntu

Ubuntu下Postman如何进行数据加密

小樊
37
2025-12-22 03:32:23
栏目: 网络安全

Ubuntu下Postman数据加密实操指南

一 前置说明与安全边界

二 在请求前对参数进行加密

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

function aesEncrypt(content, key, iv) {
  const k = CryptoJS.enc.Utf8.parse(key);
  const i = CryptoJS.enc.Utf8.parse(iv);
  return CryptoJS.AES.encrypt(content, k, { iv: i, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString();
}

const plain = pm.environment.get('plainText') || 'admin';
const key  = pm.environment.get('aes_key');   // 16/24/32 字节
const iv   = pm.environment.get('aes_iv');    // 16 字节

pm.environment.set('encryptedData', aesEncrypt(plain, key, iv));
// Pre-request Script
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());
  });
  return; // 首次加载,等待下次请求再执行加密
}
eval(pm.globals.get('forgeJS'));

function rsaEncrypt(content, pubPem) {
  const pub = forge.pki.publicKeyFromPem(pubPem);
  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())
  }));
}

const data = pm.environment.get('plainText') || 'admin';
const pub = pm.environment.get('RSA_Public_Key'); // PEM 格式
pm.environment.set('encryptedData', rsaEncrypt(data, pub));

三 动态占位与批量加密

// 动态占位与批量加密
function getBracketStr(t) {
  const m = t.match(/\{\{(.+?)\}\}/);
  return m ? m[1] : '';
}

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());
  });
  return;
}
eval(pm.globals.get('forgeJS'));

const aesEncrypt = (c, k, i) => {
  const K = CryptoJS.enc.Utf8.parse(k), I = CryptoJS.enc.Utf8.parse(i);
  return CryptoJS.AES.encrypt(c, K, { iv: I, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }).toString();
};

const rsaEncrypt = (c, p) => {
  const P = forge.pki.publicKeyFromPem(p);
  return forge.util.encode64(P.encrypt(c, 'RSAES-PKCS1-V1_5', {
    md: forge.md.sha1.create(), mgf: forge.mgf.mgf1.create(forge.md.sha1.create())
  }));
};

const payload = typeof request.data === 'string' ? JSON.parse(request.data) : request.data || {};
const headers = request.headers ? Object.assign({}, request.headers) : {};
const all = Object.assign({}, payload, headers);

Object.keys(all).forEach(k => {
  const v = String(all[k]);
  const m = getBracketStr(v);
  if (!m) return;
  const [alg, src] = m.split('$');
  let enc = '';
  if (alg === 'aes') enc = aesEncrypt(pm.environment.get(src), pm.environment.get('aes_key'), pm.environment.get('aes_iv'));
  else if (alg === 'rsa') enc = rsaEncrypt(pm.environment.get(src), pm.environment.get('RSA_Public_Key'));
  if (enc) {
    if (payload[k]) payload[k] = enc;
    else headers[k] = enc;
    pm.environment.set(m, enc); // 便于调试与复用
  }
});

四 配置SSL客户端证书与HTTPS

五 常见问题与最佳实践

0
看了该问题的人还看了