jmeter 接口测试 签名_[接口测试]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:

1importjava.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

94f6e95955f76d263499285a8bcff23f.png

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

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

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

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

1import java.util.Base642import 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());910//编码11K=Hex.decodeHex("233952DEE4D5ED5F9B9C6D6FF80FF478")12N=Hex.decodeHex("62EC67F9C3A4A407FCB2A8C49031A8B3");13P = Base64.getEncoder().encode("passwd".getBytes())14log.info(new String(P).toString()) //cGFzc3dk15log.info(Hex.encodeHexString(P))//6347467a6333646b1617key = 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//24bd5cdd7a4ad40aaa194978bbedc08f222324//解码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,接口测试,签名)