请求头中的JMeter SHA256

时间:2015-04-03 17:10:36

标签: jmeter sha256

我正在使用Jmeter加载测试API。请求的Header有一个身份验证请求,需要我使用url + Nonce + Unix时间戳Base64和SHA256带有密钥的结果值。 以上内容需要在头文件中与Nonce和timestamp一起传递。

对于上述场景,我应该创建自定义函数还是使用任何预处理器?

4 个答案:

答案 0 :(得分:1)

您可以通过Beanshell PreProcessor执行以下操作:

  1. 添加HTTP标头管理器作为HTTP请求采样器的子级
  2. 以相同的方式添加上述Beanshell PreProcessor
  3. 将以下代码放入PreProcessor的“脚本”区域:

    import org.apache.commons.httpclient.auth.DigestScheme; // necessary imports
    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.apache.jmeter.protocol.http.control.Header;
    
    String url = sampler.getUrl().toString(); // get URL
    String nonce = DigestScheme.createCnonce(); // get nonce
    long timestamp = System.currentTimeMillis() / 1000L;
    
    String combined = url + nonce + timestamp; // put everything together
    
    byte[] base64 = Base64.encodeBase64(combined.getBytes()); // encode as Base64
    
    String headerValue = DigestUtils.sha256Hex(base64); // encode SHA256 
    
    sampler.getHeaderManager().add(new Header("headerName", headerValue)); // add generated header to request
    
    • sampler这里是父HTTP请求采样器类的简写引用,我相信它是HTTPSamplerProxy所以它的方法用于获取URL并添加生成的头值。
    • 生成MD5哈希和SHA256十六进制的方法来自Apache Commons库,这些库在JMeter的引擎下广泛使用。
  4. 有关在JMeter测试中使用Beanshell脚本的详细信息,请参阅How to use BeanShell: JMeter's favorite built-in component指南。

答案 1 :(得分:0)

最好的办法是在JavaScript模式下使用BSF预处理器来完成客户端通常会做的所有事情。您必须使用客户端JS并将其修改为不使用FORM数据。

您可以在JS中构建完整的标头,就像客户端一样。 BSF预处理器允许您访问jmeter运行时变量,因此您将创建一个新的存储SHA256哈希值,并在需要授权的样本的HTTP标头管理器中使用它。

-Addled

答案 2 :(得分:0)

下载了eclipse。 写了一个自定义的jmeter包。 从eclipse到jmeter lib / ext文件夹将其导出为.jar。 在beanshell sampler中调用包函数

感谢您的回答

答案 3 :(得分:0)

@ dmitrit的答案很有帮助,但我需要对代码进行一些调整才能使其正常工作。这是我做的:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;

String apiKey = vars.get("ApiKey");
String apiSecret = vars.get("ApiSecret");
long timestamp = System.currentTimeMillis() / 1000L;

String combined = apiKey + apiSecret + timestamp;

String generatedSignature = DigestUtils.sha256Hex(combined);

vars.put("GeneratedSignature", generatedSignature);

请注意主要区别是:

  • 最重要的DigestUtils.sha256Hex需要String而不是字节数组。首先将字节转换为字节会搞乱哈希,我认为是由于填充。
  • 我将结果值添加到vars,以便以后以常规方式(${GeneratedSignature})在Jmeter中使用。
  • ApiKeyApiSecret在Jmeter用户定义变量元素的其他位置定义。

有了这个,我就可以根据他们在here发布的身份验证说明与Mashery进行以下工作。