温馨提示×

Ubuntu下Postman如何进行数据加密

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

Ubuntu下Postman数据加密实操指南

一 前置说明与安全边界

  • Ubuntu 上,Postman 的加密通常指两类:一是对请求参数做业务加密(如 AES、RSA、Base64、MD5),二是对传输通道启用 HTTPS/SSL 客户端证书。前者通过脚本在发送前处理,后者在 Postman 设置中导入证书,两者可叠加使用。
  • 客户端加密只能保护“网络传输中的内容”,无法替代后端的鉴权、签名与校验;密钥/IV 等敏感信息不要硬编码在脚本中,建议放入受控的变量或外部密钥管理服务。

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

  • 准备变量:在集合或环境的 Variables 中预置需要的变量,如 aes_key、aes_iv、RSA_Public_Key,请求体中使用占位符(如 {{encryptedData}})。
  • 对称加密示例(AES-CBC + PKCS7,CryptoJS 内置):
// 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));
  • 非对称加密示例(RSA,forge.js):
// 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));
  • 使用方式:在请求 Body/Params 中填入 {{encryptedData}},发送前脚本会自动替换为加密结果。

三 动态占位与批量加密

  • 约定占位语法:在需要加密的字段值写成 {{aes$varName}}{{rsa$varName}},脚本会自动识别并替换为加密结果。
  • 参考实现要点(放在集合级 Pre-request Script,便于复用):
// 动态占位与批量加密
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); // 便于调试与复用
  }
});
  • 说明:首次运行会从网络加载 forge.js,可能导致该次请求跳过加密;再次发送即可生效。

四 配置SSL客户端证书与HTTPS

  • 在 Postman 顶部菜单进入 File → Settings → General → SSL certificate verification,点击 Add Certificate,按提示上传 CRT/PFX 证书及对应私钥(如证书受密码保护需输入密码),保存后发起以 https:// 开头的请求会自动携带客户端证书完成双向认证。

五 常见问题与最佳实践

  • 首次请求失败并伴随 “forge.js 未定义”:这是脚本按需加载 forge.js 所致,忽略首次失败,再次发送即可;也可将 forge.js 文件下载到本地并通过本地静态资源加载以提升稳定性。
  • 密钥与 IV 管理:避免硬编码,使用环境/集合变量集中管理;为 AES-CBC 选择足够强度的 key/iv(如 16/24/32 字节与 16 字节),并与服务端约定一致。
  • 编码与格式:RSA 输出通常为 Base64Base64 仅是编码并非加密,敏感信息仍需强加密;如请求体为 JSON,请确保加密后仍为合法字符串再赋值。
  • 清理敏感变量:在 Tests 脚本中按需清除临时变量(如 pm.environment.unset('encryptedData')),减少泄露面。

0