Jmeter引⽤js实现RSA加密
Jmeter提供了JSR223 PreProcessor前置处理器,该⼯具融合了Java 8 Nashorn 脚本引擎,可以执⾏js脚本以便对脚本进⾏前置处理。其中⽐较典型的应⽤就是通过执⾏js脚本对前端数据进⾏rsa 加密,如登录密码加密。
Jmeter提供了JSR223 PreProcessor前置处理器,通过该⼯具融合了Java 8 Nashorn 脚本引擎,可以执⾏js脚本以便对脚本进⾏前置处理。其中⽐较典型的应⽤就是通过执⾏js脚本对前端数据进⾏rsa加密,如登录密码加密。
rsa加密⽅式形如(⽤到了security.js这个脚本):
jQuery.ajax({
type:"post",
url:"loginset",
success:function(rd){
if(rd!=null){
//加密模
var Modulus = rd.split(';')[0];
//公钥指数
var public_exponent = rd.split(';')[1];
//通过模和公钥参数获取公钥
var key = KeyPair(private_exponent, "", Modulus);
//颠倒密码的顺序,要不然后解密后会发现密码顺序是反的
var reversedPwd = password.split("").reverse().join("");
//对密码进⾏加密传输
var encrypedPwd = ptedString(key,reversedPwd);
jQuery('#subPwd').val(encrypedPwd);
jQuery('#loginPwd').val("");
jQuery('#login').submit();
}
}
如何在
jmeter
中执⾏这个js,获得加密后的串呢?
⾸先调⽤请求获取公钥所需的参数(exponent、modulus
通过正则表达式提取到参数后,作为参数传递到JSR223前置处理器中,⽣成公钥,然后再对登录密码进⾏加密。
JSR223前置处理器及写出的脚本如下图
这⾥exponent、modulus、passwd应该是在上⼀请求中获取后作为变量传⼊,这⾥简化,直接给定,
最后将加密后的字符串输出到变量data中,以供后续使⽤。
load("security.js");
print("starttest");
function RSA(){
var exponent="10001";
var
modulus="eba486abd41cc0950eae9972f58f43c62bba871660b86905cebbbbffcac137915744a2d37c25a8915562343602761293297baf84386da8ab7e847338f4b0aa347bfd847c55319d18efc0d802865 var passwd="1234";
var publicKey = KeyPair(exponent, '', modulus);
ptedString(publicKey, passwd);
}
var data = RSA();
log.info(data);
vars.put("Password",data);
在执⾏过程中遇到⼏个问题,js脚本开发
1、 Problem in JSR223 script JSR223 PreProcessor javax.script.ScriptException: ReferenceError: "window" is not defined in security.js at line number 10
at jdk.nashorn.api.scripting.NashornScriptEngine.throwAsScriptException(NashornScriptEngine.java:470)
at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:454)
解决办法:报window未定义,window为security.js中引⼊,为浏览器执⾏js执⾏的全局对象。
此问题排查了很久,⽹上也未有说明,最后到是
Nashorn JS脚本引擎并不⽀持浏览器的这些对象,需要对js脚本进⾏改造。后来检索
JavaScript 对象,了解到在顶层 JavaScript 代码中,可以⽤关键字 this 引⽤全局对象。将js末尾的window修改为this后未再报错。
2、在前置处理器中引⽤js脚本,但是实际脚本不运⾏也不报错
解决办法:需要将js脚本放到jemete bin⽬录下调⽤,将前置处理器中的⽂件选择清空。执⾏成功,不报错。
3、调试时可⽤ log.info(data);或print("starttest");进⾏打印输出。
4、要加密的字符串需要反序处理,否则解密后字符串是反的。(此问题与加密js有关)
var
reversedPwd = password.split(
""
).reverse().join(
""
);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。