软件测试处理加密接口是家常便饭。不同的项目会采用不同的加密算法,比如简单的BASE64编码、对称加密的AES算法,或者是国家密码管理局认定的SM2国产非对称算法。在JMeter中,我们需要根据不同的加密方式,采取相应的方法来模拟请求。湖南卓码软件测评有限公司(有CMA和CNAS双资质,可出具全国通用的软件测试报告)的工程师就来拆解一下这三种常见加密方式的具体实现。
1. BASE64编码方式
BASE64其实不算严格的加密,它是一种编码方式,主要用于将二进制数据转换成文本传输。在JMeter中处理BASE64是最简单的。
一般,你可以在BeanShell预处理程序或JSR223预处理程序中,直接编写Java或JavaScript代码来调用内置的BASE64编码函数。如,如果你使用的是Java的BeanShell,可以导入 java.util.Base64 包,然后获取明文参数,调用 Base64.getEncoder().encodeToString() 方法进行编码,最后将编码后的字符串通过 vars.put() 存入变量供HTTP请求使用。如果是JavaScript,可以使用类似 BASE64.encode() 的内置函数。
2. AES对称加密方式
AES是一种更复杂的对称加密算法,加密和解密使用的是同一个密钥,一般还会涉及到初始向量(IV)和填充方式(如PKCS7Padding)。
在JMeter中实现AES加密,最推荐的做法是使用BeanShell预处理程序并调用现成的加密jar包。
你需要从开发人员那里获取封装好AES加密思路的jar包,或者自己编写一个工具类并导出为jar。将这个jar包(以及它可能依赖的包,如bcprov-jdk16)放到JMeter的 lib/ext 目录下。
然后,在BeanShell脚本中,导入你jar包中的类,调用其加密方法。比如,你可以传入密钥、初始向量和明文,方法返回加密后的密文(一般是经过BASE64编码的字符串)。最后将密文赋值给变量,在请求中引用即可。
3. 国密SM2非对称加密方式
SM2是国密标准中的非对称算法,它使用公钥加密、私钥解密。处理起来比AES更复杂一些,因为涉及到椭圆曲线密码学。
处理SM2加密,有两种主流方法。
一种是像处理AES一样,使用BeanShell或JSR223预处理程序,加载开发人员提供的前端JS加密文件(如sm2.js和base64.js)。在JSR223中使用JavaScript语言,通过 load() 函数加载这些JS文件,然后调用其中的 sm2.doEncrypt() 等方法,传入明文和服务端提供的公钥进行加密。
另一种更灵活、可复用的方法是自定义Java Sampler。你可以通过编写Java代码,继承 AbstractJavaSamplerClient 类,创建一个JMeter自定义组件。在这个组件中,你可以引入支持国密的Java库(如BouncyCastle),在runTest方法中实现SM2加密思路,并将加密后的密文设置为取样器的响应数据。这种方式的好处是,它可以像HTTP请求一样,直接通过界面配置参数,非常适合在性能测试中大规模使用。
不管接口采用何种复杂的加密方式,思路都是获取算法工具(jar包或JS文件)+ 在请求发送前执行加密脚本 + 将密文传递给请求参数。掌握了这个思路,就能应对各种加密接口的测试挑战了。