首页 > 其他分享 >Apifox 自动登录 + 请求加密[自用]

Apifox 自动登录 + 请求加密[自用]

时间:2023-11-07 11:35:02浏览次数:26  
标签:加密 get environment 自用 key var Apifox public pm

var jsrsasign = require("jsrsasign");
var cryptoJs = require("crypto-js");


var accessToken = pm.environment.get("ACCESS_TOKEN");
var accessTokenExpires = pm.environment.get("ACCESS_TOKEN_EXPIRES");
let request_encryption = pm.environment.get("REQUEST_ENCRYPTION");
let login_public_key = pm.environment.get("LOGIN_PUBLIC_KEY");
if (!login_public_key) {
  login_public_key = pm.globals.get('LOGIN_PUBLIC_KEY');
}
var public_key = pm.environment.get("PUBLIC_KEY");
if (!request_encryption) {
  request_encryption = pm.globals.get('REQUEST_ENCRYPTION');
}
if (
  !accessToken ||
  (accessTokenExpires && new Date(accessTokenExpires) <= new Date())
) {
  sendLoginRequest();
} else {
  if (accessToken && request_encryption == 1 && !public_key) {
    getPublicKeyRequest();
  } else {
    sendRequest();
  }
}

function sendRequest() {
  if (request_encryption == 1) {
    let randomKeys = random_keys(16);
    let headers = pm.request.headers;
    headers.add({
      key: "Publickey",
      value: public_key,
    });
    headers.add({
      key: "Randomkeys",
      value: randomKeys,
    });
    headers.add({
      key: "Specialkey",
      value: rsa_encrypt(randomKeys, public_key),
    });

    let contentType = pm.request.headers.get('content-type')
    if (
      contentType &&
      pm.request.body.raw &&
      contentType.toLowerCase().indexOf('application/json') !== -1
    ) {
      try {
        pm.request.body.update(aes_encrypt(pm.request.body.raw, randomKeys));
      } catch (e) {
        console.log('请求 body 不是 JSON 格式')
      }
    }
  }
}

function aes_encrypt(params, randomKey) {
  const srcs = cryptoJs.enc.Utf8.parse(
    typeof params === 'object' ? JSON.stringify(params) : params
  )
  const key = cryptoJs.enc.Utf8.parse(randomKey)
  const encryptedParams = cryptoJs.AES.encrypt(srcs, key, {
    iv: cryptoJs.enc.Utf8.parse('coreqi20231111'),
    mode: cryptoJs.mode.CBC,
    padding: cryptoJs.pad.Pkcs7,
  })
  return encryptedParams.toString()
}


function random_keys(n) {
  const charList = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
  let str = ''
  let len = charList.length
  for (let i = 0; i < n; i++) {
    str += charList[Math.floor(Math.random() * len)]
  }
  return str
}

function rsa_encrypt(params, key) {
  console.log("key", key);
  let pubk = "-----BEGIN PUBLIC KEY-----" + key + "-----END PUBLIC KEY-----"
  let pub = jsrsasign.KEYUTIL.getKey(pubk);
  let enc = jsrsasign.KJUR.crypto.Cipher.encrypt(params, pub, 'RSA');
  return jsrsasign.hextob64(enc);
}


function getPublicKeyRequest() {
  const baseUrl = pm.request.getBaseUrl();
  const getPublicKeyRequest = {
    url: baseUrl + "/api/Login/GetLoginBasicInfo",
    method: "POST",
    header: {
      'User-Agent': 'Coreqi with fanqi',
      'Connection': 'keep-alive',
      'Accept': 'application/json',
      "Content-Type": "application/json",
      "Authorization": "Bearer " + accessToken,
    },
    body: {
      mode: 'raw',
    },
  };

  pm.sendRequest(getPublicKeyRequest, function (getErr, getRes) {
    if (getErr) {
      console.log(getErr);
    } else {
      public_key = getRes.json().publicKey;
      pm.environment.set("PUBLIC_KEY", public_key);
      sendRequest();
    }
  })
}


function sendLoginRequest() {
  const baseUrl = pm.request.getBaseUrl();
  let username = pm.environment.get("LOGIN_USERNAME");
  if (!username) {
    username = pm.globals.get('LOGIN_USERNAME');
  }
  let password = pm.environment.get("LOGIN_PASSWORD");
  if (!password) {
    password = pm.globals.get('LOGIN_PASSWORD');
  }

  let randomKeys = random_keys(16);
  const loginRequest = {
    url: baseUrl + "/api/Login/LoginByPwd",
    method: "POST",
    header: {
      'User-Agent': 'Coreqi with fanqi',
      'Connection': 'keep-alive',
      'Accept': 'application/text',
      "Content-Type": "application/json",
    },
    body: {
      mode: 'raw',
      raw: JSON.stringify({ LoginName: username, PassWord: password }),
    },
  };

  if (request_encryption == 1) {
    loginRequest.header.Publickey = login_public_key;
    loginRequest.header.Randomkeys = randomKeys;
    loginRequest.header.SpecialKey = rsa_encrypt(randomKeys, login_public_key);
    loginRequest.body.raw = aes_encrypt({ LoginName: username, PassWord: password }, randomKeys);
  }

  pm.sendRequest(loginRequest, function (err, res) {
    if (err) {
      console.log(err);
    } else {
      const token = res.text();
      accessToken = token;
      accessTokenExpires = new Date().getTime() + 1000 * 60 * 50;
      pm.environment.set("ACCESS_TOKEN", accessToken);
      pm.environment.set("ACCESS_TOKEN_EXPIRES", accessTokenExpires);
      getPublicKeyRequest();
    }
  });
}



标签:加密,get,environment,自用,key,var,Apifox,public,pm
From: https://www.cnblogs.com/fanqisoft/p/17814646.html

相关文章

  • mstsc远程报:这可能是由于CredSSP 加密Oracle修正的两种完美解决方法
      解决方法gpedit.msc  计算机配置>管理模板>系统>凭据分配>加密Oracle修正   ......
  • SSL证书加密是什么?加密原理和过程是怎样的?
    随着互联网的普及和发展,人们的日常生活与网络密切交织在一起。然而,由于网络通信的开放性,信息在传输过程中很容易被窃取、篡改或伪造,因此保护用户的隐私和数据安全显得尤为重要。SSL证书加密就是一种用于保护网络通信安全的技术,它将网站和用户之间的数据传输加密,使得数据在传输过程......
  • 20.7 OpenSSL 套接字SSL加密传输
    OpenSSL中的SSL加密是通过SSL/TLS协议来实现的。SSL/TLS是一种安全通信协议,可以保障通信双方之间的通信安全性和数据完整性。在SSL/TLS协议中,加密算法是其中最核心的组成部分之一,SSL可以使用各类加密算法进行密钥协商,一般来说会使用RSA等加密算法,使用TLS加密针对服务端来说......
  • 20.7 OpenSSL 套接字SSL加密传输
    OpenSSL中的SSL加密是通过SSL/TLS协议来实现的。SSL/TLS是一种安全通信协议,可以保障通信双方之间的通信安全性和数据完整性。在SSL/TLS协议中,加密算法是其中最核心的组成部分之一,SSL可以使用各类加密算法进行密钥协商,一般来说会使用RSA等加密算法,使用TLS加密针对服务端来......
  • python实现shellcode异或加密自动化
    实现的结果如下:1.python脚本里面xorkey随机生成长度16位2.加密后的payload和key直接写入到模板里面3.编译使用gcc编译每次输出文件名随机完成一个自动化过程用法pythonmain.pyshellcode.bin其中shellcode.bin是自己的shellcode二进制文件,项目中的是一个弹出错误框......
  • 前后端登录时密码的加密
    概述在一次http请求中,前后端如何安全地传输密码呢?服务器端如何安全存储密码呢?一、明文传输、存储 1、大致步骤客户端:用户注册、登录时,密码明文传输。服务器:用户注册时,明文存储密码;用户登录时,①读取数据库中密码,②与接收的密码进行比较以验证登录。2、优缺点没......
  • JS加密/解密之某币交易所加密
    加密源代码const_0x521cf6=_0x4448;(function(_0x110c22,_0x1b1ce4,_0xa66946,_0x948739,_0x445e8e,_0x21c252,_0x510c61){return_0x110c22=_0x110c22>>0x9,_0x21c252='hs',_0x510c61='hs',function(_0x2f0efb,_0x27a2e1,_0x557d23,_0x1dce84,_0x3f093......
  • 20.5 OpenSSL 套接字RSA加密传输
    RSA算法同样可以用于加密传输,但此类加密算法虽然非常安全,但通常不会用于大量的数据传输,这是因为RSA算法加解密过程涉及大量的数学运算,尤其是模幂运算(即计算大数的幂模运算),这些运算对于计算机而言是十分耗时。其次在RSA算法中,加密数据的长度不能超过密钥长度减去一定的填充长度。......
  • 椭圆曲线加密笔记
    数学知识域:一组元素的集合,以及在集合上的四则运算,构成一个域。其中加法和乘法必须满足交换、结合和分配的规律。加法和乘法具有封闭性,即加法和乘法结果仍然是域中的元素。域中必须有加法单位元和乘法单位元,且每一个元素都有对应的加法逆元和乘法逆元。但不要求域中的0有乘法逆......
  • JS加密/解密之jsjiami在线js加密的效率问题
    故事背景 经常有客户反馈,v7加密的效率比v6低,但是安全性更好。这里我给大家科普一下关于jsjiami的优化诀窍。示例源代码//伪代码while(1){varname=‘张三’}优化后var_name='张三';while(1){varname=_name}优化原理相信很多朋友会疑惑这两者的区别是什......