JMETER,JSR223 脚本中的问题,JSR223 预处理器 javax.script.ScriptException

问题描述 投票:0回答:1

我正在尝试通过 JMeter 对网站进行登录测试。我获悉他们正在使用 SHA 256 哈希和 AES 加密来确保安全。前端端的 SHA,我希望将其与密码的数据库端进行比较,然后我需要对哈希密码进行 AES 加密

我正在通过 CSV 文件传递我的用户信息(用户名、密码)。我能够毫无问题地检索它们。

问题出在我的剧本上。我对自己的写作能力没有信心。所以我的脚本需要帮助。

我尝试了以下脚本;

import java.security.MessageDigest;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;



String plaintextPassword = vars.get("PASSWORD");


try {
    // Step 1: SHA-256 Hashing
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(plaintextPassword.getBytes());
    byte[] digest = md.digest();

    StringBuilder sha256Hash = new StringBuilder();
    for (byte b : digest) {
    ** sha256Hash.append(String.format("%02x", b));** **Line 17**
    }

    String _Key = "____"; // I came to conclusion that I need random key to be able to perform my AES       encryption. That's why "_Key" is here...

    // Step 2: AES Encryption
    Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

    // Generate SecretKeySpec from Base64 encoded key
    SecretKeySpec secretKey = new SecretKeySpec(Base64.decodeBase64(_Key), "AES");

    _Cipher.init(Cipher.ENCRYPT_MODE, secretKey);

   byte[] encryptedBytes = _Cipher.doFinal(sha256Hash.toString().getBytes());

   // Convert the encrypted bytes to a Base64-encoded string
   String encryptedPassword = Base64.encodeBase64String(encryptedBytes);

   vars.put("encryptedPassword", encryptedPassword);

} catch (Exception e) {
    log.error("Error occurred: " + e.getMessage());
    throw new RuntimeException(e);
}

并期望同时执行 SHA 和 AES。但是,当我运行我的脚本时,我在 JMeter 上收到以下错误

“错误 o.a.j.m.JSR223PreProcessor:JSR223 脚本、JSR223 预处理器存在问题 javax.script.ScriptException:源文件:内联评估:

import java.security.MessageDigest; import javax.crypto.Cipher; import javax.cry . . . '' : Error in method invocation: Static method format( java.lang.String, byte ) not found in class'java.lang.String' : at **Line: 17** : in file: inline evaluation of: 
import java.security.MessageDigest;导入 javax.crypto.Cipher;导入 javax.cry 。 。 。 '' : 字符串.format ( "%02x" , b ) 在内联评估中:``import java.security.MessageDigest;导入 javax.crypto.Cipher;导入 javax.cry 。 。 。 '' 在第 17 行 在 bsh.engine.BshScriptEngine.evalSource(BshScriptEngine.java:93) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19] 在 bsh.engine.BshScriptEngine.eval(BshScriptEngine.java:46) ~[bsh-2.0b6.jar:2.0b6 2016-02-05 05:16:19] 在 javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:231) ~[java.scripting:?] 在 org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:232) ~[ApacheJMeter_core.jar:5.6.2] 在 org.apache.jmeter.modifiers.JSR223PreProcessor.process(JSR223PreProcessor.java:45) ~[ApacheJMeter_components.jar:5.6.2] 在 org.apache.jmeter.threads.JMeterThread.runPreProcessors(JMeterThread.java:983) ~[ApacheJMeter_core.jar:5.6.2] 在 org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:561) ~[ApacheJMeter_core.jar:5.6.2] 在 org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:501) ~[ApacheJMeter_core.jar:5.6.2] 在 org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:268) ~[ApacheJMeter_core.jar:5.6.2] 在 java.lang.Thread.run(Thread.java:1623) [?:?] "

我似乎无法找到我遇到的错误的确切解决方案。说实话,我不知道我的剧本是否正确。 我正在将脚本作为 Java 脚本运行。

任何帮助将不胜感激。 谢谢你

encryption jmeter sha
1个回答
0
投票
  1. 不要使用Beanshell,因为它与Java不完全兼容并且存在性能问题,尤其是在加密操作方面。更多信息:Beanshell 与 JSR223 与 Java For JMeter:完全对决

  2. 您的代码可以修改为如下所示:

    def secretKey = 'your-secret-key-here'
    
    def plaintextPassword = vars.get("PASSWORD");
    
    def sha = MessageDigest.getInstance("SHA-256")
    byte[] keyBytes = secretKey.getBytes("UTF-8")
    keyBytes = sha.digest(keyBytes)
    
    def key = Arrays.copyOf(keyBytes, 16)
    def secretKeySpec = new SecretKeySpec(key, "AES")
    
    def cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec)
    
    def encrypted = cipher.doFinal(plaintextPassword.getBytes("UTF-8"))
    
    def encryptedPassword = new String(encrypted.encodeBase64().toString())
    
    vars.put("encryptedPassword", encryptedPassword)
    

更多信息:使用 Groovy 加密和解密

© www.soinside.com 2019 - 2024. All rights reserved.