http://lemfix.com/topics/344

前言

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

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

而目前为主,大部分公司的产品都是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("1234")
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加密得到加密后的数据。

python 调用java脚本的加密(没试过,先记录在此)的更多相关文章

  1. Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例及配置文件具体解释

    Linux(centos 6.5) 调用java脚本以及定时运行的脚本实例 一.调用java程序脚本(默认已经搭建好了Java环境) 1.jdk 安装路径 /usr/jdk/jdk1.7/-- 2.j ...

  2. Python 调用 Shell脚本的方法

    Python 调用 Shell脚本的方法 1.os模块的popen方法 通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出. > ...

  3. Python调用Java代码部署及初步使用

    Python调用Java代码部署: jpype下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#jpype 下载的时候需要使用Chrome浏览器进行下载 ...

  4. Python调用Java(基于Ubuntu 18.04)

    最近实习,需要使用Python编程,其中牵涉到一些算法的编写.由于不熟悉Python,又懒得从头学,而且要写的算法自己之前又用Java实现过,就想着能不能用Python调用Java.经过查找资料,方法 ...

  5. python调用Java代码,完毕JBPM工作流application

    1.缘由 有一庞大Python django webproject,要引入工作流引擎,像OA一样.方便的流程控制与管理.Python或django关于工作流的开源插件,稀少,并且弱爆了,终于选用jav ...

  6. 使用 jpype 库实现 Python 调用 java 的 jar 包中的功能

    一.what's the JPype JPype 是一个能够让 python 代码方便地调用 Java 代码的工具.在某些时候 java 的能力更强,我们可以用 java 写一个模块的功能然后用 Py ...

  7. python调用java

    这么个标题多少有点蛋疼的感觉,两个都是互联网时代的语言,学习成本和执行效率也差不多,之所以会产生这种需求,多半是想在python中引用java的类,例如安卓和hadoop的生态圈,基本是java代码的 ...

  8. python 调用 java代码

    一.JPype简述 1.JPype是什么? JPype是一个能够让 python 代码方便地调用 Java 代码的工具,从而克服了 python 在某些领域(如服务器端编程)中的不足. 2.JPype ...

  9. python调用shell脚本时需要切换目录

    最近遇到了一个问题,就是python代码调用shell脚本时,发现输入输出的文件,总是和自己预想的有偏差,但是单独在linux下执行命令的时候,却没有错误.后来发现是相对路径的问题,因为执行pytho ...

随机推荐

  1. Net线程间通信的异步机制

    线程间通信 我们看下面的图 我们来看线程间通信的原理:线程(Thread B)和线程(Thread A)通信, 首先线程A 必须实现同步上下文对象(Synchronization Context), ...

  2. c#基础用法

    1.注释符 1)注销 2)解释 2.3种方式 1)单行注释 // 2)多行注释 /*要注释的内容*/ 3)文档注释 /// 多用来解释类或方法 3.数据类型 1)值类型 2)引用类型 1.对象 obj ...

  3. Java【基础学习】 之调用构造方法顺序【坑】

    解释:这里的super()仅仅是用来占位的,实际上,必须是严格按照分层初始化的过程:1.先初始化父类X的成员变量,即初始化成员变量Y,打印出:Y2.初始化父类X的构造方法,打印出:X3.父类初始化完成 ...

  4. php实现大文件上传分片上传断点续传

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  5. QSetting介绍

    简介 QSettings类提供了持久的跨平台应用程序设置. 用户通常期望应用程序记住它的设置(窗口大小.位置等)所有会话.这些信息通常存储在Windows系统注册表,OS X和iOS的属性列表文件中. ...

  6. mac 安装 报错 "/usr/local/include/stdint.h:2:10: error: #include nested too deeply"

    报错详细信息 构建错误 - “#include嵌套太深” /usr/local/include/stdint.h:2:10: error: #include nested too deeply #in ...

  7. 数据结构实验之查找六:顺序查找(SDUT 3378)

    (不知道为啥开个数组就 TLE .QAQ) #include <stdio.h> #include <stdlib.h> #include <string.h> / ...

  8. PowerBuilder 这么古老的语言(破解一软件)

     PowerBuilder 这么古老的语言,编辑器用的6.5的好古老的气息,好吧破解木有兴趣了, 不过嘛可以说一下破解思路,这个系统使用的是圣天狗,联网版的. 复制狗(暴力,没技术味道) 模拟狗(也是 ...

  9. php中函数 isset(), empty(), is_null() 的区别

    NULL:当你在你的脚本中写下这样一行代码 $myvariable; //此处你想定义一个变量,但未赋值.会有Notice: Undefined variable echo $myvariable + ...

  10. 狼人杀面杀APP(FGUI教程)

    本教程为FairyGUI进阶教程,这是一套完整的面杀桌游APP.游戏不仅有发放随机身份的功能,还涉及10个页面的切换与各页面不同状态(最多达9种状态)的切换,众多复杂UI的交互,多语言切换,3D粒子在 ...