我正在尝试通过 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 脚本运行。
任何帮助将不胜感激。 谢谢你
不要使用Beanshell,因为它与Java不完全兼容并且存在性能问题,尤其是在加密操作方面。更多信息:Beanshell 与 JSR223 与 Java For JMeter:完全对决
您的代码可以修改为如下所示:
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 加密和解密