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
五 常见问题与最佳实践
pm.environment.unset('encryptedData')),减少泄露面。