[接口测试]JMeter中的字符串加密处理

Posted TesterQ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[接口测试]JMeter中的字符串加密处理相关的知识,希望对你有一定的参考价值。

接口测试过程中,经常会遇到带Token或签名等的请求。这里所谓的Token或签名,是一串加密后的字符串,作为请求体或请求头或URL中的一个参数放在Request中。

一 采用MD5算法

MD5是一种常见的消息摘要算法,采用加密函数对原始消息进行处理,如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。JMeter内置__MD5函数支持MD5算法:

二 采用SHA256算法

SHA256是另一种常见的消息摘要算法,提供比MD5更安全的加密功能,JMeter中,可以通过脚本来使用,具体的操作方法如下:

 1import org.apache.commons.codec.binary.Base64
2import org.apache.commons.codec.digest.DigestUtils
3import org.apache.jmeter.protocol.http.control.Header
4
5url = sampler.getUrl().toString()
6nonce = "passwd"
7timestamp = System.currentTimeMillis()    
8combined = url + nonce + timestamp;
9base64 = Base64.encodeBase64(combined.getBytes());
10
11// encode SHA256
12headerValue = DigestUtils.sha256Hex(base64);
13log.info(headerValue)

以上脚本在请求消息中添加了一个包头,名字为headerName,值为一个sha256加密函数处理过的字符串

三 AES算法

AES也是一种常见的加密算法,AES有多种工作模式,其中Java默认的工作模式为AES/ECB/PKCS5Padding:

 1import java.util.Base64
    
      
      
    
 2import javax.crypto.Cipher;
3import javax.crypto.spec.SecretKeySpec;
4import org.apache.commons.codec.binary.Hex;
5import org.apache.jmeter.protocol.http.control.Header
6
7//加密,默认使用AES/ECB/PKCS5Padding
8key = "bad8deadcafef00d";//16byte hex string
9data= "ravih's 银行密码"
10skeySpec = new SecretKeySpec(key.getBytes(), "AES");
11cipher = Cipher.getInstance("AES");
12cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
13log.info("Base64 encoded: " + 
14     Base64.getEncoder().encode(data.getBytes()).length);
15//对data进行加密,加密后转码为Base64数组
16original = Base64.getEncoder().
17           encode(cipher.doFinal(data.getBytes()))
18encData=new String(original)//数组转字符串
19log.info(encData)  //bA7pGW4+beWxxgKOoEikKYjwfpY5A2Geg+2ugXIPGGk=
20
21
22//解密
23key = "bad8deadcafef00d";
24skeySpec = new SecretKeySpec(key.getBytes(), "AES");
25cipher = Cipher.getInstance("AES");
26cipher.init(Cipher.DECRYPT_MODE, skeySpec);
27log.info("Base64 decoded: "
28        + Base64.getDecoder().decode(encData.getBytes()).length);
29original = cipher.doFinal(Base64.getDecoder().
30                  decode(encData.getBytes()));
31log.info( new String(original).trim()) //ravih's 银行密码  

四 采用其他加密算法

除了以上常见MD5及 SHA256加密算法以外,还有一些加密算法,比如AES, DES, EvpKDF, HMAC-MD5, HMAC-SHA1/3/256/512, MD5, PBKDF2, Rabbit, SHA1/3/224/256/512, TripleDES等,JMeter中需要依赖第三方的库来支持这些算法,这类库中比较有名的有MIT的bouncycastle(简称BC),IBMJCE等, 这里以BC为例:

1、下载BC相关jar包: https://www.bouncycastle.org/latest_releases.html[接口测试]JMeter中的字符串加密处理

2、将下载下来的第三方jar包放到CLASSPATH中去,这里提供两种方法:

方法一:放到JMETER_HOME的lib目录中去

方法二:在JMeter测试计划中,直接添加jar文件

3、使用BC提供加密能力:

 1import java.util.Base64
2import java.security.Security;
3import javax.crypto.Cipher;
4import javax.crypto.spec.IvParameterSpec;
5import javax.crypto.spec.SecretKeySpec;
6import org.apache.commons.codec.binary.Hex;
7import org.bouncycastle.jce.provider.*
8Security.addProvider(new BouncyCastleProvider());
9
10//编码
11K=Hex.decodeHex("233952DEE4D5ED5F9B9C6D6FF80FF478")
12N=Hex.decodeHex("62EC67F9C3A4A407FCB2A8C49031A8B3");
13P = Base64.getEncoder().encode("passwd".getBytes())
14log.info(new String(P).toString()) //cGFzc3dk
15log.info(Hex.encodeHexString(P))//6347467a6333646b
16
17key = new SecretKeySpec(K, "AES");
18ins = Cipher.getInstance("AES/EAX/NoPadding", "BC");
19ins.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(N));
20log.info(Hex.encodeHexString(ins.doFinal(P)))
21//24bd5cdd7a4ad40aaa194978bbedc08f
22
23
24//解码
25out = Cipher.getInstance("AES/EAX/NoPadding", "BC");
26C = Hex.decodeHex("24bd5cdd7a4ad40aaa194978bbedc08f");
27out.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(N));
28dec = out.doFinal(C)
29log.info(new String(dec).toString())
30log.info(new String(Base64.getDecoder().decode(dec)))

图注:TesterQ公众号



以上是关于[接口测试]JMeter中的字符串加密处理的主要内容,如果未能解决你的问题,请参考以下文章

利用JMeter的beanshell进行接口的加密处理

接口测试教程-jmeter

使用Jmeter测试MD5加密接口性能测试实战

记录下jmeter处理接口RSA+base64学习过程

jmeter接口测试-使用rsa加密解密算法

接口测试中的加密算法如何实现?