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等必须与后端约定一致。
四 常见问题与排查
eval 执行,避免运行时拉取。