【问题标题】:JMeter SHA256 in request header请求标头中的 JMeter SHA256
【发布时间】:2017-06-20 07:33:03
【问题描述】:

我正在使用 Jmeter 对 API 进行负载测试。请求的标头有一个身份验证请求,需要我对 url+Nonce+Unix 时间戳进行 Base64 处理,并使用密钥对结果值进行 SHA256 处理。 以上需要在header中与Nonce和timestamp一起传递。

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

【问题讨论】:

  • 我没有要求程序,我只是在问最好的方法是什么!

标签: jmeter sha256


【解决方案1】:

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

  1. 将 HTTP 标头管理器添加为 HTTP 请求采样器的子项
  2. 以同样的方式添加前面提到的 Beanshell PreProcessor
  3. 将以下代码放入预处理器的“脚本”区域:

    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 Request Sampler 类的简写引用,我相信它是 HTTPSamplerProxy,因此它的方法用于获取 URL 并添加生成的标头值。
    • 生成MD5哈希和SHA256十六进制的方法来自Apache Commons库,这些库在JMeter的引擎盖下被广泛使用。

有关在 JMeter 测试中使用 Beanshell 脚本的更多信息,请参阅 How to use BeanShell: JMeter's favorite built-in component 指南。

【讨论】:

  • 这是另一种选择,我会尝试的。现在我正在尝试创建一个自定义 Java 类并将其导入 lib 文件夹并使用函数调用。
【解决方案2】:

最好的办法是在 JavaScript 模式下使用 BSF 预处理器来执行客户端通常会执行的所有操作。您必须使用客户端 JS 并对其进行修改以使其在没有 FORM 数据的情况下工作。

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

-添加

【讨论】:

  • 谢谢。现在我正在尝试创建一个自定义 Java 类并将其导入 lib 文件夹并使用函数调用。
【解决方案3】:

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

感谢您的回答

【讨论】:

    【解决方案4】:

    @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,以便以后可以在 Jmeter 中以通常的方式 (${GeneratedSignature}) 使用它。
    • ApiKeyApiSecret 在 Jmeter 用户定义变量元素中的其他位置定义。

    有了这个,我能够按照他们在here发布的身份验证说明使用 Mashery 进行以下工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多