JMeter中的JavaScript加密实战

JMeter中的JavaScript加密实战

在性能测试领域,Apache JMeter 作为一款强大的开源工具,广泛应用于模拟多用户并发请求以评估应用程序的性能。然而,在实际的测试场景中,直接传输明文敏感信息(如用户密码、API密钥等)可能会带来安全风险。因此,在JMeter中集成加密功能,尤其是利用JavaScript进行数据加密,成为了一种提升测试安全性和真实性的有效手段。本文将通过实战案例,详细介绍如何在JMeter中利用JavaScript实现数据加密。

一、引言

JMeter 提供了丰富的扩展性,通过内置的JSR223 Sampler和PostProcessor等组件,用户可以轻松集成JavaScript代码进行脚本编写。虽然JMeter内置的JavaScript引擎(如Mozilla Rhino)在性能上可能不如现代JavaScript引擎,但它足以满足大多数性能测试脚本编写的需求,包括数据加密。

二、准备工作

在实战之前,首先需要确定加密方式。由于JavaScript本身不直接支持复杂的加密算法(如RSA、AES等),我们需要寻找适用于Rhino引擎的轻量级JavaScript加密库。

三、实战步骤

1. 将加密库放到JMeter的bin目录下

image

2. 新建一个 JSSR233 PreProcessor,选择 JavaScript 语言

image

3. 编写 JavaScript 代码,进行加密操作,并设置变量返回

// 对象覆盖
var navigator = this;
var window = this;

// 加载js文件
load("crypto-js.min.js");
load("jsencrypt.min.js");

// 公钥
var public_key = '-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDII4nWFbcBSfu/VDurEQjL165m\nqMzroujtv8C1JDmCRxqSMUSe3Omv0yw4Z0VbnejBBYSftV4Ftv81WeNSt9jabRO9\ncHpvAAGeZyssFQ1wieoGg7GRoPlHWU611Oi4VkmRnv37GyCwvR/yo2FO4WoWOfFU\ncjwsVFwhDvWHtLpJ4QIDAQAB\n-----END PUBLIC KEY-----'

//随机key
function getKey() {
    var random_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
    var str_str = ""
    for (var i = 0; i < 16; i++) {
        // 生成一个从0到字符串长度(不包括长度本身)的随机数  
        var randomIndex = Math.floor(Math.random() * random_str.length)
        // 使用随机索引从字符串中抽取一个字符  
        str_str += random_str.charAt(randomIndex)
    }
    return str_str
}

// RSA加密
function rsaUtil(txt) {
    var encryptor = new JSEncrypt();
    encryptor.setPublicKey(public_key);
    return encryptor.encrypt(txt);
}

// AES加密
function aesUtil(aesKey, text) {
    // 假设您有一个密钥(key)和一个要加密的文本(text)  
    var key = CryptoJS.enc.Utf8.parse(aesKey); // 密钥需要是16(AES-128)、24(AES-192)或32(AES-256)字节长  

    // 使用CryptoJS的AES加密函数  
    var encrypted = CryptoJS.AES.encrypt(text, key, {
        mode: CryptoJS.mode.ECB, // 常见的模式有ECB、CBC、CFB、OFB等,但请注意ECB模式不推荐用于安全敏感的应用  
        padding: CryptoJS.pad.Pkcs7
    });

    return encrypted.toString();
}

// 拼接proDate
function proData(user_name, passwprd) {
    return '{"account":"' + user_name + '","password":"' + passwprd + '","verify_code":"","verify_img_base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAAAyCAAAAAASf+qvAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAARUlEQVR42u3PAQEAAAgCIP/PdYE/Ch6QHhY5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ub+5AfLkoMlhsnqUAAAAAElFTkSuQmCC","verify_code_time":"","verify_code_hash":""}'
}

var aesKey = getKey()
// 加密的data
var encryptedData = aesUtil(aesKey, proData(1, 2))
// 加密的key
var encryptedKey = rsaUtil(aesKey)

//设置变量
vars.put("encrypt_data", encryptedData);
vars.put("encrypt_key", encryptedKey);

4. 使用JMeter其他组件引用加密的变量

image

5. 运行结果

image

posted @ 2024-09-25 10:57  测试小罡  阅读(246)  评论(0编辑  收藏  举报