JMeter中使用BCrypt实现密码哈希的问题排查
问题背景
需求:使用BCrypt哈希生成器对任意字符串加密
已执行操作:
- 在JMeter的Lib文件夹中添加BCrypt相关Jar包
- 重启JMeter
- 在JSR223 Sampler中编写以下代码:
String password = "1234"; String bcryptHashString = BCrypt.withDefaults().hashToString(10, password.toCharArray());
遇到的异常:
2023-10-06 13:27:53,749 ERROR o.a.j.p.j.s.JSR223Sampler: Problem in JSR223 script JSR223 Sampler, message: javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: BCrypt for class: Script228
javax.script.ScriptException: groovy.lang.MissingPropertyException: No such property: BCrypt for class: Script228
at org.codehaus.groovy.jsr223.GroovyScriptEngineImpl.eval(GroovyScriptEngineImpl.java:320) ~[groovy-jsr223-3.0.5.jar:3.0.5]
at org.codehaus.groovy.jsr223.GroovyCompiledScript.eval(GroovyCompiledScript.java:71) ~[groovy-jsr223-3.0.5.jar:3.0.5]
at javax.script.CompiledScript.eval(Unknown Source) ~[?:1.8.0_381]
at org.apache.jmeter.util.JSR223TestElement.processFileOrScript(JSR223TestElement.java:217) ~[ApacheJMeter_core.jar:5.4.1]
at org.apache.jmeter.protocol.java.sampler.JSR223Sampler.sample(JSR223Sampler.java:72) [ApacheJMeter_java.jar:5.4.1]
at org.apache.jmeter.threads.JMeterThread.doSampling(JMeterThread.java:638) [ApacheJMeter_core.jar:5.4.1]
at org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:558) [ApacheJMeter_core.jar:5.4.1]
at org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:489) [ApacheJMeter_core.jar:5.4.1]
at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:256) [ApacheJMeter_core.jar:5.4.1]
问题原因
这个异常说明Groovy脚本找不到BCrypt类,常见原因有三个:
- 引入的Jar包不是对应BCrypt库的正确版本或完整包
- Jar包放置的目录不正确,导致JMeter未加载
- 脚本中缺少
BCrypt类的导入语句
解决步骤
1. 确认Jar包正确性
确保你下载的是正规的BCrypt Jar包,比如常用的jBCrypt库(对应类路径org.mindrot.jbcrypt.BCrypt),或者Spring Security的BCrypt实现(org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder),不要使用不兼容的第三方Jar包。
2. 检查Jar包位置
将Jar包放在JMeter安装目录下的lib文件夹中(不要放在lib/ext或其他子目录),放置完成后必须完全关闭并重新启动JMeter,确保Jar包被JMeter的类加载器识别。
3. 修改脚本添加导入语句
根据你使用的BCrypt库,在脚本开头添加对应的导入语句,以下是两种常见库的示例:
示例1:使用jBCrypt库
import org.mindrot.jbcrypt.BCrypt String password = "1234"; // 生成哈希字符串,10是工作因子 String bcryptHashString = BCrypt.hashpw(password, BCrypt.gensalt(10)); // 可将结果存入JMeter变量供后续使用 vars.put("bcryptHash", bcryptHashString);
示例2:使用Spring Security的BCrypt实现
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder String password = "1234"; BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(10); String bcryptHashString = encoder.encode(password); vars.put("bcryptHash", bcryptHashString);
4. 验证解决方案
重启JMeter后运行JSR223 Sampler,若不再抛出异常且能成功生成哈希字符串,说明问题已解决。
内容的提问来源于stack exchange,提问作者Rahul

