python自动化测试登录前端加密传参
我们从这几个方面分析
- RSA加密
- 报错问题
- 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