接口测试时遇到 java 代码加密请求数据,用 python 的我该怎么办?

本贴最后更新于 354 天前,其中的信息可能已经天翻地覆

前言

自动化测试应用越来越多了,尤其是接口自动化测试。

在接口测试数据传递方面,很多公司都会选择对请求数据进行加密处理。

而目前为主,大部分公司的产品都是 Java 语言实现的。所以加密处理也是 Java 实现的。

作为用 python 做测试的我,要做接口自动化时,如何去对请求数据进行加密呢?


解决方法

基于此,首先去找开发了解一下具体的加密过程,甚至可以画一个加密流程图出来。

一种方法是:用 python 代码去实现加密流程。

对测试人员技术能力有所要求,对加密的实现也需要与开发人员密切进行交流。

另外一种便捷的方法就是:直接用 python 语言调 Java 的加密方式,得到加密后的数据。

这种方式的好处:不用管加密的过程。只要知道如何调用、怎么传加密数据,怎么得到加密后的数据就可以。



使用 python 语言调用 Java 加密代码 - 方式一

此处感谢歪歪大佬提供了 Java 版加密代码。

本篇文章中,歪歪大佬角色:开发 GG

1、了解需要用到的加密信息

而我作为测试 MM((有一点 Java 基础的)做的第一件事情就是:

愉快的和开发 GG 聊起了天,咨询了在 Java 的加密方式中,调用哪个函数可以实现数据加密

第二件事情,就是让开发 GG 给我打了一个 jar 包。这样我用 python 代码直接调用 jar 包里的函数就可以了。

image.png



2、开始编写 python 代码,调用 Java 包里的加密函数。

python 是胶水语言,可以与很多语言一起使用。

python3 有个第三方库 Jpype1(下载地址:https://pypi.org/project/JPype1/)

将开发提供的 jar 包放在 py 工程的目录下面。

image.png



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("1234")
print(res)   # 打印加密数据

# 关闭JVM
jpype.shutdownJVM()



运行此段代码之后,对数据 1234 的加密结果 为:

image.png



使用 python 语言调用 Java 加密代码 - 方式二

在完成以上操作之后,我又开始和开发 GG 聊了起来,问了一句,我可以直接给 jar 包传参吗?不用去调用 Java 的函数,在调用 jar 包的同时 给它传参,直接得到加密后的数据?

开发 GG 说,可以!等我改一下,我重新发一个 jar 给你。

于是,5 分钟后,开发 GG 甩了我一个新的 jar 包,告诉我使用方式。我又愉快的开启了第二种使用模式。

使用方式是这样的:在命令行当中使用 Java 命令行:Java -jar jar 包 -d 要加密的数据。命令行输出的就是加密后的数据了。

我在命令行试了一下,果真如此:

image.png

于是,我转换成了 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)

执行结果如下:

image.png



综上,当我们在用 python 遇到 Java 加密的时候。可以使用以上 2 种方式来利用 Java 加密得到加密后的数据。

当然,在这个过程中,我也会遇到问题。当有问题时,我会向开发 GG 咨询,因为从启动 JVM 之后,都是 Java 了,运行出错了或者整不明白的,我都会向开发 GG 请教。

所以,在工作当中有什么问题,自己查资料的基础上,多与相关人员进行沟通,带着具体的问题去沟通和请教。

希望大家也可以多多有自己解决问题的能力。

1 操作
xiaojian 在 2020-08-07 10:13:12 更新了该帖
2 回帖
请输入回帖内容 ...
  • potato
  • longwutian004

    Traceback (most recent call last):
    File "F:/python/learning/use_jar.py", line 28, in
    res = JDClass.encrytor("1234")
    TypeError: No matching overloads found for aes.EncrypAES.encrytor(str), options are:
    public java.lang.String aes.EncrypAES.encrytor(java.lang.String) throws java.security.InvalidKeyException,javax.crypto.IllegalBlockSizeException,javax.crypto.BadPaddingException

    at JPMethod::findOverload(native\common\jp_method.cpp:242)
    at JPMethod::findOverload(native\common\jp_method.cpp:245)
    at JPMethod::invoke(native\common\jp_method.cpp:253)
    at PyJPMethod::__call__(native\python\pyjp_method.cpp:142)
    

    使用第一种方法,我这报错了