Postman使用RSA加密字段及保存认证token


现有项目中认证使用OAuth2进行认证,为了安全密码用RSA加密,调试接口时需要先生成密码再调试,于是是否可以用Postman用RSA加密方式自动生成密码。研究发现Postman并没有自带RSA加密方式,现有的方案是使用第三方模块forge.js来实现加密,决定使用forge.js来实现RSA方式加密。

下载及安装forge.js

准备环境

安装git、nodejs,具体安装方法不在本方中赘述,不会可以问度娘。

下载forge.js

// github 下载
git clone https://github.com/digitalbazaar/forge.git

// gitee 下载
git clone https://gitee.com/mirrors_digitalbazaar/forge_1.git

安装forge.js

npm install

配置Postman

编写Pre-request Script脚本

想要加密Postman字段得需要用到Postman的Pre-request Script脚本编辑器,脚本如下。

//postman自带的加密函数是cryptoJS,无法满足;因此需要引用第三方库forge.js
//调用forge.js服务的地址:https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js打不开时,就用https://lzq1357.gitee.io/various/forge_min.js
const forge_url = "https://lzq1357.gitee.io/various/forge_min.js"

// 提取{{}}中内容
function getBracketStr(text) {
    let result = ''
    let regex = /{{(.+?)}}/g;
    let options = text.match(regex);
    if (options && options.length > 0) {
        let option = options[0];
        if (option) {
            result = option.substring(2, option.length - 2)
        }
    }
    return result
}

// RSA加密方法
function rsaEncrypt(content){
	  // RSA公钥密码保存在全局变量rsa_pub_key里
    var public_key ='-----BEGIN PUBLIC KEY-----\n'+
                pm.globals.get("rsa_pub_key") + '\n' +
                '-----END PUBLIC KEY-----'
    //公钥转化为pem格式
    var publicKey = forge.pki.publicKeyFromPem(public_key)
    //创建缓冲区,所需要加密内容设置编码格式
    var buffer = forge.util.createBuffer(content, 'utf8')
    //转化为字节
    var bytes = buffer.getBytes()
    //加密函数,把明文使用'RSAES-PKCS1-V1_5'加密成密文,并使用Base64编码输出
    var encryptedText = forge.util.encode64(publicKey.encrypt(bytes,'RSAES-PKCS1-V1_5',{
        md:forge.md.sha256.create(),
        mgf1:{
            md:forge.md.sha1.create()
        }
    }));
    return encryptedText;   
};

// ------------ AES 加密 ------------
function aesEncrypt(content){
    const key = CryptoJS.enc.Utf8.parse(pm.globals.get("aes_key"));
    const iv = CryptoJS.enc.Utf8.parse(pm.globals.get("aes_iv"));
    const encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
    return encrypted.toString();
}

//第一次运行时从网络加载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 forge.js: Succeed,please try again")
            pm.globals.set('forgeJS',res.text())
        }
    });
    return;
};
//设置全局变量forgeJS
eval(pm.globals.get('forgeJS'))
// 获取当前请求中的加密变量 判断为字符串还是环境变量,环境变量一定是"{{}}" 格式
let requestData; 
if((typeof request.data) === 'string'){
    requestData = JSON.parse(request.data)
} else {
    requestData = request.data;
}

// Object.assign 拷贝对象 将request.headers 中的所有数据,拷贝到 requestData中
requestData = Object.assign(requestData, request.headers);
// 遍历
Object.keys(requestData).map(key => {
     // 内容
    let value = requestData[key] + '';
    // 是否为变量
    if (value.indexOf('{{') !== -1) { 
        let content = getBracketStr(value);
        // 判断用是否加密,并选择加密方式
        if (content.indexOf('aes:') !== -1) {
            let c = content.split('aes:')[1];
            let encryptedContent = pm.environment.get(c); // 加密内容
            encryptedContent = encryptedContent ? encryptedContent : c;
            pm.environment.set(content, aesEncrypt(encryptedContent));
        } else if (content.indexOf('rsa:') !== -1) {
            let c = content.split('rsa:')[1];
            let encryptedContent = pm.environment.get(c); // 加密内容
            encryptedContent = encryptedContent ? encryptedContent : c;
            pm.environment.set(content, rsaEncrypt(encryptedContent));
        }
    }
});

配置密码到全局变量

Pre-request Script脚本需要配置全局变量rsa_pub_key,aes_key,aes_iv具体配置如下图。
全局变量配置图

使用方法

需要加密的字段使用 {{aes:123456}} 或者 {{rsa:123456}} 来配置,aes或者rsa指加密方式,冒号后面是密码的明文。具体配置如下图所示。
加密使用方法

保存OAuth2认证token信息

保存OAuth2认证token信息需要用到Postman和Tests脚本,如保存其 access_token、token_type、refresh_token等。

配置Tests脚本

var jsondata = JSON.parse(responseBody);
var access_token = jsondata.token_type + ' ' + jsondata.access_token;
var refresh_token = jsondata.token_type + ' ' + jsondata.refresh_token;
pm.globals.set("access_token", access_token);
pm.globals.set("refresh_token", refresh_token);

使用方法

如加密字段一样,通过 {{access_token}} 来使用。示例如下图所示。
token使用方法
至此,Postman使用RSA加密字段及保存认证token已经完成!!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Postman可以通过使用前置脚本来实现RSA加密。在前置脚本中,你可以使用JavaScript的RSAKey库或者pycryptodome库来进行RSA加密操作。 如果你选择使用JavaScript的RSAKey库,你可以按照以下步骤进行操作: 1. 在Pre-request-Script页签中,引入RSAKey库。你可以使用以下代码来获取RSAKey库: ``` if (!pm.globals.has("forgeJS")) { pm.sendRequest("https://raw.githubusercontent.com/loveiset/RSAForPostman/master/forge.js", function (err, res) { if (err) { console.log(err); } else { pm.globals.set("forgeJS", res.text()); } }) } else { eval(postman.getGlobalVariable("forgeJS")); } ``` 2. 获取公钥,并创建RSA对象: ``` var rsa_public_key = pm.globals.get("RSA"); var publicKey = forge.pki.publicKeyFromPem(rsa_public_key); ``` 3. 使用RSA对象对请求参数进行加密,并将加密结果保存在环境变量中: ``` var encryptedText = forge.util.encode64(publicKey.encrypt(pm.environment.get("raw_sword"), 'RSAES-PKCS1-V1_5', { md: forge.md.sha1.create(), mgf1: { md: forge.md.sha1.create() } })); pm.environment.set("sword", encryptedText); ``` 如果你选择使用pycryptodome库来进行RSA加密,你可以按照以下Python代码进行操作: ```python from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 # 定义待加密的数据 data = "hello, world!" # 读取公钥文件,并创建RSA对象 with open('public.pem', 'rb') as f: key = RSA.import_key(f.read()) rsa = PKCS1_v1_5.new(key) # 对数据进行RSA加密 encrypted_data = rsa.encrypt(data.encode('utf-8')) # 输出加密后的数据 print(encrypted_data.hex()) ``` 以上是使用Postman实现RSA加密的方法,你可以根据自己的需求选择适合的方法进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值