python自动化测试 - python RSA加密传参

python自动化测试登录前端加密传参

我们从这几个方面分析

  1. RSA加密
  2. 报错问题
  3. publicKey js和python的区别

1.RSA加密

我们在自动化测试过程中,前端加密传参后端解密,其实对于我们来说达到登录成功的效果就可以,我们也只需要加密传参,网上有很多rsa的讲解,我这里就大概说一下

publickey = ```key值```
// 加密密码
    encryptedData(data) {
      // 新建JSEncrypt对象
      const encryptor = new JSEncrypt()
      // 设置公钥
      encryptor.setPublicKey(this.publicKey)
      // 加密数据
      return encryptor.encrypt(data)
    },

这是我们前端提供的 一部分代码
外加一个jsencrypt.js的文件

我们用的时候,直接引入此文件

import { JSEncrypt }from './jsencrypt'

这样就没问题了

2.报错问题

按常理来说,我们解决了加密之后,就可以py去调用了
性价比最高的调用方式就是PyExecJS

//安装依赖
pip3 install PyExecJS

def js_from_file(file_name):
    """
    读取js文件
    :return:
    """
    with open(file_name, 'r', encoding='UTF-8') as file:
        result = file.read()

    return result
最后,使用 execjs 类的compile()方法编译加载上面的 JS 字符串,返回一个上下文对象

import execjs

context1 = execjs.compile(js_from_file('./add.js'))

result1 = context1.call("add", 2, 3)

print(result1)

这个方式这样调用普通的js文件没有任何问题
但是,在我们的js 文件中,我们引入了另外的文件
这里之前报了各种错误,我忘了截图,最主要的报错问题是这个:
execjs._exceptions.ProcessExitedWithNonZeroStatus: (1, ‘’, "[stdin]:2\nimport { JSEncrypt }from ‘./jsencrypt’\n^^^^^^\n\nSyntaxError: Cannot use import statement outside a module\n
在这里插入图片描述
提示我Cannot use import statement outside a module,无法在模块外部使用import语句,因为Module 的加载实现的是es6语法

问了前端小伙伴之后了解到,这需要nodejs进行一些这样那样的配置,但是
本人作为一只懒散的菜鸡,为了这点内容,再重新去学习前端的配置,对自动化测试来说其实并不划算,所以这个问题就无解了吗
是的

3.python 使用rsa库直接调用
其实聪明的小伙伴肯定能直接想到此方法进行调用,但本人比较菜,所以还绕了一圈
在知道前端加密方式后,我们 完全可以用python中的RSA库实现
这边先贴上代码

import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA

# 使用标准格式的pubKey加密
def encrypt(__password, public_key):
    rsa_key = RSA.importKey(public_key)
    cipher = Cipher_pksc1_v1_5.new(rsa_key)
    cipher_text = base64.b64encode(cipher.encrypt(__password.encode()))
    return cipher_text.decode()
    
key = '这边替换成自己的'
password = encrypt_by_js_format_pub_key('123456', key)
print('password:', password)

这样呢,就又遇到了报错
在这里插入图片描述
查阅资料后,发现需要加上rsa的固定格式
public_key = ‘-----BEGIN PUBLIC KEY-----\n’ + public_key + ‘\n-----END PUBLIC KEY-----’

一般到这就不会再有问题了,可以直接在传参中调用此文件就ok

import requests

from try_rsa import encrypt_by_js_format_pub_key as try_rsa

key= 'xxx'

url ='http://xxx'

data = {
    'username': 'admin',
    'password': try_rsa('123456', key),
    'loginType': 'DATA_CENTER'
}
res = requests.request(method='post', url=url, data=data)
print(res.text)

这样就调用成功了

TIPS:
JS的公钥和python的公钥格式是不一样的,前端给了key之后,如果直接调用 ,会报这种错
在这里插入图片描述
所以需要格式转换一下,直接把_替换成/ , 把-替换成+

   __public_key = __public_key.replace('_', '/')
    __public_key = __public_key.replace('-', '+')

这个可以在方法里面直接replace一下就ok

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值