接口测试时遇到 java 代码加密请求数据,用 python 的我该怎么办?
前言
自动化测试应用越来越多了,尤其是接口自动化测试。
在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理。
而目前为主,大部分公司的产品都是java语言实现的。所以加密处理也是java实现的。
作为用python做测试的我,要做接口自动化时,如何去对请求数据进行加密呢?
解决方法
基于此,首先去找开发了解一下具体的加密过程,甚至可以画一个加密流程图出来。
一种方法是:用python代码去实现加密流程。
对测试人员技术能力有所要求,对加密的实现也需要与开发人员密切进行交流。
另外一种便捷的方法就是:直接用python语言调java的加密方式,得到加密后的数据。
这种方式的好处:不用管加密的过程。只要知道如何调用、怎么传加密数据,怎么得到加密后的数据就可以。
使用python语言调用java加密代码 - 方式一
此处感谢歪歪大佬提供了java版加密代码。本篇文章中,歪歪大佬角色:开发GG
1、了解需要用到的加密信息
而我作为测试MM((有一点java基础的)做的第一件事情就是:
愉快的和开发GG聊起了天,咨询了在Java的加密方式中,调用哪个函数可以实现数据加密
第二件事情,就是让开发GG给我打了一个jar包。这样我用python代码直接调用jar包里的函数就可以了。

2、开始编写python代码,调用java包里的加密函数。
python是胶水语言,可以与很多语言一起使用。
python3有个第三方库Jpype1(下载地址:https://pypi.org/project/JPype1/)
将开发提供的jar包放在py工程的目录下面。

python代码如下(看每一行代码的注释哦):
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Name: use_jar
# Author: liyuan
# Time: 17:01 import jpype # 引入库 import os
jvmpath = jpype.getDefaultJVMPath() # 获取本地默认使用的java JVM路径。
# 获取jar包的位置。将jar包放在python的目录下面。
jarpath = os.path.join(os.path.split(os.path.abspath(__file__))[0],"jars/")
print(jarpath)
# 启动java环境。-Djava.class.path指定要应用的jar包。
jpype.startJVM(jvmpath,"-ea", "-Djava.class.path=%s" % (jarpath +
'encryption-0.0.1-SNAPSHOT-jar-with-dependencies.jar'))
# 通过jpype编写java的输出语句,打印hello world!
jpype.java.lang.System.out.println("hello World") # 使用jar包中的类。通过包名.类名。包名为:com.lemon.encryption.类名为:RSAManager.
# JDClass代表RSAManager类。
JDClass = jpype.JClass("com.lemon.encryption.RSAManager")
# 类的实例化。开发GG告诉我不需要实例化,直接调用就可以。是静态类。
# jd = JDClass()
# 调用类下的加密函数:encryptWithBase64,传的参数为:1234
# res用来接收加密函数的返回值。即加密后加密数据。
res = JDClass.encryptWithBase64("")
print(res) # 打印加密数据 # 关闭JVM
jpype.shutdownJVM()
运行此段代码之后,对数据1234的加密结果 为:

使用python语言调用java加密代码 - 方式二
在完成以上操作之后,我又开始和开发GG聊了起来,问了一句,我可以直接给jar包传参吗?不用去调用java的函数,在调用jar包的同时 给它传参,直接得到加密后的数据?
开发GG说,可以!等我改一下,我重新发一个jar给你。
于是,5分钟后,开发GG甩了我一个新的jar包,告诉我使用方式。我又愉快的开启了第二种使用模式。
使用方式是这样的:在命令行当中使用java命令行:java -jar jar包 -d 要加密的数据。命令行输出的就是加密后的数据了。
我在命令行试了一下,果真如此:

于是,我转换成了python代码(需要获取命令行执行的结果,所以要用到subprocess模块):
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Name: use_jar_os
# Author: liyuan
# Time: 17:32 import os
import subprocess
import chardet # 获取jar包路径
jarpath = os.path.join(os.path.split(os.path.abspath(__file__))[0],
"jars/encryption-0.0.1-SNAPSHOT-jar-with-dependencies-2.jar")
# 终端命令行命令。加密的数据为:hello,java
command = "java -jar {} -d {}".format(jarpath,"hello,java")
# 执行command的,并获取命令执行之后的输出数据。
stdout,stderror = subprocess.Popen(command,stdout=subprocess.PIPE
,stderr=subprocess.PIPE,shell=True).communicate()
# 编码处理
encoding = chardet.detect(stdout)["encoding"]
result = stdout.decode(encoding)
print(result)
执行结果如下:

综上,当我们在用python遇到 java加密的时候。可以使用以上2种方式来利用java加密得到加密后的数据。
当然,在这个过程中,我也会遇到问题。当有问题时,我会向开发GG咨询,因为从启动JVM之后,都是java了,运行出错了或者整不明白的,我都会向开发GG请教。
所以,在工作当中有什么问题,自己查资料的基础上,多与相关人员进行沟通,带着具体的问题去沟通和请教。
最后,希望大家也可以多多有自己解决问题的能力。
接口测试时遇到 java 代码加密请求数据,用 python 的我该怎么办?的更多相关文章
- Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密
Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...
- 在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决
在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决 现象:开了vpn访问公司服务器,postman可以正常发起服务器请求,但是java代码请求失败,连接超时.包括在 ...
- 接口测试中模拟post四种请求数据
https://www.jianshu.com/p/3b6d7aa2043a 一.背景介绍 在日常的接口测试工作中,模拟接口请求通常有两种方法,fiddler模拟和HttpClient模拟. Fidd ...
- 对Java代码加密的两种方式,防止反编译
使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的j ...
- Java代码实现excel数据导入到Oracle
1.首先需要两个jar包jxl.jar,ojdbc.jar(注意版本,版本不合适会报版本错误)2.代码: Java代码 import java.io.File; import java.io.Fi ...
- Java代码加密与反编译(一):利用混淆器工具proGuard对jar包加密
Java 代码编译后生成的 .class 中包含有源代码中的所有信息(不包括注释),尤其是在其中保存有调试信息的时候.所以一个按照正常方式编译的 Java .class 文件可以非常轻易地被反编译.通 ...
- 接口测试中读取excel中的请求数据含有中文问题,UnicodeEncodeError: 'latin-1' codec can't encode character '\u5c0f' in position
错误信息:UnicodeEncodeError: 'latin-1' codec can't encode character '\u5c0f' in position 31: Body ('小') ...
- java代码实现mock数据
废话不多说,直接上代码. /** * 发get请求,获取文本 * * @param getUrl * @return 网页context */ public static String sendGet ...
- Java代码批量插入数据到MySQL
1.批量插入 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundExc ...
随机推荐
- MySQL优化(一)
MySQL数据库优化一之引索详解 对于网站优化最注重的就是数据库的优化,而在数据库优化中首先考虑到的应该是数据库索引是否建立于是否建立的正确. 1.对于刚刚接触数据库的程序员,对于引索不是很理解.下面 ...
- 跟我学SpringCloud | 第九篇:服务网关Zuul初
SpringCloud系列教程 | 第九篇:服务网关Zuul初探 前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散 ...
- Spring Framework 条件装配 之 @Conditional
Spring Framework 条件装配 之 @Conditional 前言 了解SpringBoot的小伙伴对Conditional注解一定不会陌生,在SpringBoot项目中,Conditio ...
- 设计模式-外观模式(Facade)
外观模式又称为门面模式,为一组类似功能的集群,比如类库.子系统等,提供一致的入口供client调用 角色和职责: 1.门面(Facade)-Computer: 外观模式的核心.它被客户角色调用,它熟悉 ...
- POJ 3680:Intervals(最小费用最大流)***
http://poj.org/problem?id=3680 题意:给出n个区间[Li,Ri],每个区间有一个权值wi,要使得每个点都不被超过k个区间覆盖(最多能被k个区间覆盖),如果选取了第i个区间 ...
- 看看大神 Paul Graham 对如何学习编程的回答
前言 我翻阅自己之前写的博客文章,发现在 2015 年我刚开始学习编程的时候,翻译了一段 Paul Graham 关于"How can I learn to program?"的回 ...
- django基础知识之定义模板:
定义模板 模板语言包括 变量 标签 { % 代码块 % } 过滤器 注释{# 代码或html #} 变量 语法: {{ variable }} 当模版引擎遇到一个变量,将计算这个变量,然后将结果输出 ...
- python3 连接数据库注意点
类库:pymysql ''' Created on 2019年 @author: Root ''' import pymysql from name import getName # 数据库连接信息 ...
- 从零开始基于go-thrift创建一个RPC服务
Thrift 是一种被广泛使用的 rpc 框架,可以比较灵活的定义数据结构和函数输入输出参数,并且可以跨语言调用.为了保证服务接口的统一性和可维护性,我们需要在最开始就制定一系列规范并严格遵守,降低后 ...
- mysql 免安装版本 与问题记录
将文件解压到D盘, 创建 my.ini 配置文件, ------------------复制进去--------------------- [client] port=3306 default-cha ...