第一次写博客,写点关于测试工作中遇到的问题及解决方法,如果能够给大家多一些参考资料是最好的了。
公司信贷系统测试的时候需要调用增信通等外部接口,接口使用到了AES加密,关于AES加密就不多介绍了具体参考这篇文章:https://blog.csdn.net/qq_28205153/article/details/55798628
由于还有好多的外部接口需要联调,于是决定用Jmeter做一个接口测试的集成,选定工具开干。先是编写一个线程,内容如下:
请求的请求头、参数、和URL什么的都不用说了,根据需求文档填写进去就好,重点说一下怎么调用AES加密的jar包进行加密的。
1.如上图控制器中添加了一个BeanShell Sampler(增信通加密)和一个http请求(身份核验),前置BeanShell脚本是调用AESUtil加密jar包实现加密方法,对本次需要传入的参数进行加密,加密后的参数然后再用到“身份核验”的http请求中进行接口测试。其中打**的账号密码都是增信通授权给的账号,接口文档中会有(没有就找开发或者对接人要)。BeanShell脚本如下:
import AESUtil.*;
String publicKey = "R8iZjoZ7H6H4243O";
String params= AESUtil.encrypt(
"{\"id_no\":\"${id_no}\",\"protocol_data_type_name\":[\"shenFenHeYan\"],\"name\":\"${name}\"}");//加密参数
vars.put("params1",params);
String pswEncrypt = AESUtil.encrypt("*******"); //加密密码
vars.put("psw",pswEncrypt);
2.调用到的AES加密方法是在接口文档中会有,我们直接在eclipse中新建一个package新建一个class,然后把这段(代码见下文)丢进去就好,其中的授权账号也是需要你的调用方给。账号密码什么的都确认正确后,我们就需要导出jar包:
点击eclipse--feil--Export--Java--JAR file(不懂可以自己百度下eclipse怎么导出jar包),命名为AESUtil与Jmeter中beanShell调用的包名的一致,然后将jar包放到..\apache-jmeter-3.2\lib(自己Jmeter的lib)目录下。
package AESUtil;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class AESUtil {
private static final String AES = "AES";
private static final String CRYPT_KEY = "************";//加密key将于开帐号的时候提供。
/**
* 加密
*/
public static byte[] encrypt(byte[] src, String key) throws Exception {
Cipher cipher = Cipher.getInstance(AES);
SecretKeySpec securekey = new SecretKeySpec(key.getBytes(), AES);
cipher.init(Cipher.ENCRYPT_MODE, securekey);//设置密钥和加密形式
return cipher.doFinal(src);
}
/**
* 二行制转十六进制字符串
*/
public static String byte2hex(byte[] b) {
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++) {
stmp = (Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else
hs = hs + stmp;
}
return hs.toUpperCase();
}
public static byte[] hex2byte(byte[] b) {
if ((b.length % 2) != 0)
throw new IllegalArgumentException("长度不是偶数");
byte[] b2 = new byte[b.length / 2];
for (int n = 0; n < b.length; n += 2) {
String item = new String(b, n, 2);
b2[n / 2] = (byte) Integer.parseInt(item, 16);
}
return b2;
}
/**
* 加密
*/
public final static String encrypt(String data) {
try {
return byte2hex(encrypt(data.getBytes(), CRYPT_KEY));
} catch (Exception e) {
}
return null;
}
public static void main(String[] args) {
String publicKey = "YUUAtestYUUAtest";
String params= encrypt(
"{\"id_no\":\"12022219990101925x\",\"protocol_data_type_name\":[\"shenFenHeYan\"],\"name\":\"张三\"}");//加密参数
String pswEncrypt = encrypt("123456"); //加密密码
}
}
3.从BeanShell获得的加密参数params1后,再按照接口文档中给的报文格式在“身份核验”请求接口中组装报文,然后传送过去的参数对方会进行解密,整个在Jmeter中的加密过程就基本完成了。