在Postman中,对post参数进行RSA加密的方法。
- 首先
Body
栏目,设置为JSON格式,按图1格式定义加密字段{{rsaBody}}
,在Pre-request Script
栏目会用到。
也可以定义多个加密字段,名称加{{ }}
即可,这可以看作是Postman中定义变量的方法。
图1
{
"body":"{{rsaBody}}"
}
-
Pre-request Script
栏目,填入以下代码,并修改clearText
和encrypt_key
内容。该栏目中的javascript代码会在每次请求发送前执行。
图2
//Pre-request Script
//--------------以下为需要加密的内容,可以根据需求定义多个------------------//
var clearText = '{"arg1":"abc","arg2":123,"arg3":4.56}'; //对应{{rsaBody}}的明文
// var clearText = '{"arg1":"def","arg2":123,"arg3":7.89}';
//---------------------------------------------------------------------//
const encrypt_key = '(密钥复制到此处)';
const forge_url = 'https://lzq1357.gitee.io/various/forge_min.js';
//forge_min.js来自:https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js
//---------------------------------------------------------------------//
function encryptRsa(encrypt_key, clearText){
console.info('cleartext: ' + clearText);
//注意此处上下的BEGIN PRIVATE KEY不要删除,框架自带的
const public_key = '-----BEGIN PUBLIC KEY-----\n'
+ encrypt_key
+ '\n-----END PUBLIC KEY-----';
var publicKey = forge.pki.publicKeyFromPem(public_key);
var buffer = forge.util.createBuffer(clearText, 'utf8');
var bytes = buffer.getBytes();
var encryptedText = forge.util.encode64( publicKey.encrypt(bytes, 'RSAES-PKCS1-V1_5', {
md: forge.md.sha256.create(),
mgf1: {
md: forge.md.sha1.create()
}
})
);
console.info('encryptedText: '+ encryptedText);
return encryptedText;
};
// 第一次运行时从网络加载forgeJS,会导致请求失败
if(!pm.globals.has('forgeJS')){
console.log('request forge.js from ' + forge_url);
pm.sendRequest(forge_url, function (err, res) {
if (err) {
console.error(err);
} else {
console.info("request forgs.js: Succeed, please try again");
//注意:Pre-request Script中出现报错,可能会导致pm.globals.set失效
pm.globals.set('forgeJS', res.text());
}
}
);
return;
}
eval(pm.globals.get('forgeJS'));
//------------------以下内容根据需要修改定义,可以加密多个字段------------------------//
var encryptedText = encryptRsa(encrypt_key, clearText);
postman.setEnvironmentVariable("rsaBody", encryptedText); //rsaBody对应Body中{{}}
clearText
变量是需要加密的明文内容,encrypt_key
是加密的密钥,encryptedText
是加密后的密文,最后通过postman.setEnvironmentVariable("rsaBody", encryptedText);
将密文赋值给Body
栏目对应的字段。
注意:Pre-request Script中出现报错,可能会导致pm.globals.set失效
- 到这里就可以访问接口了。值得注意的是,第一次运行时需要从网上加载一个js脚本,不会执行加密。正常情况下第二次访问可以成功。
参考: