Jmeter引用js实现RSA加密

来源:互联网 发布:手机在线电视直播软件 编辑:程序博客网 时间:2024/06/02 05:32
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 = new RSAUtils.getKeyPair(private_exponent, "", Modulus);
                        //颠倒密码的顺序,要不然后解密后会发现密码顺序是反的
                        var reversedPwd = password.split("").reverse().join("");
                        //对密码进行加密传输 
                        var encrypedPwd = RSAUtils.encryptedString(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="eba486abd41cc0950eae9972f58f43c62bba871660b86905cebbbbffcac137915744a2d37c25a8915562343602761293297baf84386da8ab7e847338f4b0aa347bfd847c55319d18efc0d80286509fd5a73bd182d97f3949efdc070e103c89639a415b8e579628d2d182b8a1b544889ae364c43cae42b1c53b423514c9973d67";
var passwd="1234";
var publicKey = new RSAUtils.getKeyPair(exponent, '', modulus);
return RSAUtils.encryptedString(publicKey, passwd);
}
var data = RSA();
log.info(data);
vars.put("Password",data);

在执行过程中遇到几个问题,
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("");
原创粉丝点击