日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

【Postman&JMeter】使用Postman和JMeter进行signature签名

發(fā)布時(shí)間:2023/12/24 windows 26 coder
生活随笔 收集整理的這篇文章主要介紹了 【Postman&JMeter】使用Postman和JMeter进行signature签名 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用Postman和JMeter進(jìn)行signature簽名

目錄
  • 使用Postman和JMeter進(jìn)行signature簽名
    • 一、前言
    • 二、v0接口
      • 1.Postman
      • 2.JMeter
    • 三、v1接口
      • 1.Postman
      • 2.JMeter
    • 四、v2接口
      • 1.Postman
      • 2.JMeter

一、前言

? 有些接口的請(qǐng)求會(huì)帶上sign(簽名)進(jìn)行請(qǐng)求,各接口對(duì)sign的簽名內(nèi)容、方式可能不一樣,但一般都是從接口的入?yún)⒅羞x擇部分內(nèi)容組成一個(gè)字符串,然后再進(jìn)行簽名操作, 將結(jié)果賦值給sign; 完整規(guī)范的接口文檔都會(huì)有sign的算法描述。這里通過(guò)Postman的Pre-request Script以及JMeter的BeanShell前置處理器進(jìn)行接口簽名的處理。(完整代碼在每部分的最后)

被測(cè)系統(tǒng)teachSignServer:

Gitee:https://gitee.com/z417/knowledgebroadcast/tree/master/teachSignServer-tools

直接雙擊運(yùn)行.exe文件即可(密鑰文件與conf.ini需要與exe處于同一文件夾下)

其余工具:

1.bundle.js:https://github.com/joolfe/postman-util-lib/tree/master/postman

使用方式我們?cè)诤竺媸褂玫搅嗽龠M(jìn)行介紹

2.json.jar: https://mvnrepository.com/artifact/org.json/json

選擇適合的版本

點(diǎn)擊bundle

將下載的jar包置于jmeter的./lib/ext下并重啟jmeter

被測(cè)接口信息:

接口 URL Method Body 簽名規(guī)則
v0 http://127.0.0.1:5000/api/v0/teachsign POST {
"AppKey": "z417App",
"AppVer": "1.0.0",
"Data": "{"SPhone":"18662255783","EType":0}",
"DeviceName": "web",
"DeviceType": "web",
"Lang": "CN",
"Sign": "teachsign",
"TimeStamp": 1625456804
}
appkey,timestamp,data,secret四個(gè)字段的值拼接,使用32位md5進(jìn)行簽名
v1 http://127.0.0.1:5000/api/v1/teachsign POST {
"appid": "wxd930u",
"mch_id": 10100,
"device_info": 100,
"body": "{"EType":0}",
"DeviceType": "",
"nonce_str": "ibuaiVc",
"sign": "CD198C36632A274C49E5F2F028FA257C",
"source": null,
"ts": 1625456804
}
1. 參與簽名運(yùn)算的參數(shù)選用入?yún)⒗镞卾alue非空的參數(shù)
2. 參與簽名運(yùn)算的參數(shù)按照ASCII順序排序
3. 組合方式:key=value通過(guò)&符連接
4. 最后加上鹽key=secret(secret在conf.ini中配置,同理后面的私鑰與公鑰也可在其中進(jìn)行配置)
5. 使用32位md5進(jìn)行簽名,sign的字母全大寫(xiě)
v2 http://127.0.0.1:5000/api/v2/teachsign POST {
"busId": "",
"busCnl": "POS",
"requJnINo": "abceefgghkjlafksdffdsf",
"reqTxnTm": "16:30:16",
"serviceCode": "chengxusong",
"bussJnIno": "Arabic - Bahrain",
"sign": "fsdfsd",
"reqTxnDt": "20210907",
"nonceStr": "Language",
"sysCnl": "OKPOS",
"ts": 1631003416
}
1. 參與簽名運(yùn)算的參數(shù)選用入?yún)⒗镞卾alue非空的參數(shù)
2. 參與簽名運(yùn)算的參數(shù)按照ASCII順序排序
3. 使用private_key簽名
4. 使用SHA256withRSA進(jìn)行簽名

二、v0接口

1.Postman

獲取請(qǐng)求參數(shù)并將body的參數(shù)轉(zhuǎn)換為json對(duì)象

var Json = JSON.parse(pm.request.body);

獲取所需變量并將新的時(shí)間戳更新到j(luò)son對(duì)象中

var TimeStamp = Date.parse(new Date()) / 1000 - 10;
Json.TimeStamp = TimeStamp;
var AppKey = Json.AppKey;
var Data = Json.Data;
var secretKey = "a323f9b6-1f04-420e-adb9-b06ty67b0e63";

字符串拼接

var str = AppKey + TimeStamp + Data + secretKey;

進(jìn)行md5運(yùn)算并將生成的hash序列轉(zhuǎn)換為字符串

var strmd5= CryptoJS.MD5(str).toString();

修改json對(duì)象中sign并將md5對(duì)象寫(xiě)回body中

Json.Sign = strmd5; 
pm.request.body.raw = JSON.stringify(Json);  // 將修改后的JSON轉(zhuǎn)換回字符串格式寫(xiě)回到請(qǐng)求體中

完整代碼:

/* 
  vo加密規(guī)則:
  appkey,timestamp,data,secret四個(gè)字段的值拼接,使用32位md5加密
*/

/*
 * 獲取請(qǐng)求參數(shù)
 */
var Json = JSON.parse(pm.request.body);    // 將body的參數(shù)轉(zhuǎn)換為json對(duì)象 

/*
 * 獲取所需變量
 */
var TimeStamp = Date.parse(new Date()) / 1000 - 10;   // 獲取時(shí)間戳
Json.TimeStamp = TimeStamp;   // 修改JSON
var AppKey = Json.AppKey;
var Data = Json.Data;
var secretKey = "a323f9b6-1f04-420e-adb9-b06ty67b0e63";

/* 
 * 拼接字符串并加密
 */
var str = AppKey + TimeStamp + Data + secretKey;
var strmd5= CryptoJS.MD5(str).toString();   // 調(diào)用方法進(jìn)行md5運(yùn)算并將生成的hash序列轉(zhuǎn)換為字符串
Json.Sign = strmd5;   // 修改JSON
pm.request.body.raw = JSON.stringify(Json);  // 將修改后的JSON寫(xiě)回到請(qǐng)求體中

2.JMeter

在JMeter的時(shí)間戳可以直接使用JMeter自帶函數(shù)在body中獲取,當(dāng)然也可以在BeanShell前置處理器中使用代碼獲取

/1000是因?yàn)镴Meter默認(rèn)生成的時(shí)間戳為13位時(shí)間戳,我們只需要10位即可。

導(dǎo)包(org.json為第三方j(luò)ar包)

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.config.*;
import org.json.*;

獲取請(qǐng)求傳入的body,將其轉(zhuǎn)化為Json對(duì)象

// 獲取請(qǐng)求
Arguments arguments = sampler.getArguments();
// 獲取請(qǐng)求中的body內(nèi)容
Argument arg = arguments.getArgument(0);
// 獲取body的value,并將其轉(zhuǎn)化為JSONObject對(duì)象
JSONObject dataobj = new JSONObject(arg.getValue());

獲取變量并拼接

String TimeStamp = dataobj.optString("TimeStamp");
String AppKey = dataobj.optString("AppKey");
String Data = dataobj.optString("Data");
String secretKey = "a323f9b6-1f04-420e-adb9-b06ty67b0e63";
String str = AppKey + TimeStamp + Data + secretKey;

進(jìn)行md5運(yùn)算

sign = DigestUtils.md5Hex(str);

修改json對(duì)象的sign并轉(zhuǎn)換為字符串寫(xiě)回body中

dataobj.put("Sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 轉(zhuǎn)換為字符串并歇回request-body中

完整代碼:

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.jmeter.config.*;
import org.json.*;

/*
 * 獲取請(qǐng)求傳入的body,將其轉(zhuǎn)化為Json對(duì)象
 */
// 獲取請(qǐng)求
Arguments arguments = sampler.getArguments();
// 獲取請(qǐng)求中的body內(nèi)容
Argument arg = arguments.getArgument(0);
// 獲取body的value,并將其轉(zhuǎn)化為JSONObject對(duì)象
JSONObject dataobj = new JSONObject(arg.getValue());

/*
 * 獲取變量并拼接字符串
 */
// 獲取變量
String TimeStamp = dataobj.optString("TimeStamp");
String AppKey = dataobj.optString("AppKey");
String Data = dataobj.optString("Data");
String secretKey = "a323f9b6-1f04-420e-adb9-b06ty67b0e63";
// 字符串拼接
String str = AppKey + TimeStamp + Data + secretKey;

/*
 * 簽名,更新body
 */
sign = DigestUtils.md5Hex(str);  // md5運(yùn)算
dataobj.put("Sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 轉(zhuǎn)換為字符串并寫(xiě)回request-body中

三、v1接口

1.Postman

? 獲取請(qǐng)求參數(shù)并將body的參數(shù)轉(zhuǎn)換為json對(duì)象

var Json = JSON.parse(pm.request.body);

獲取時(shí)間戳并修改json對(duì)象

var ts = Date.parse(new Date()) / 1000 - 10;
Json.ts = ts;

去除sign參數(shù)本身,然后去除值是空的參數(shù)

var keys = [];
// 循環(huán)遍歷JSON
for (let k in Json ){
    // 排除json中鍵位sign以及值為空的數(shù)據(jù)
    if (k == 'sign' || !Json[k]){
        continue;
    }
    keys.push(k);  // 生成篩選后的key序列
}

排序

keys.sort();

拼接字符串

let keys_str = '';
for (let x of keys){
    keys_str += `${x}=${Json[x]}&`;  // 使用模版字符串進(jìn)行拼接
}
keys_str = keys_str + "key=a323f9b6-1f04-420e-adb9-b06ty67b0e63";

進(jìn)行md5運(yùn)算并將生成的hash序列轉(zhuǎn)換為字母全大寫(xiě)字符串

var strmd5= CryptoJS.MD5(keys_str).toString().toUpperCase();

修改json對(duì)象中sign并將md5對(duì)象寫(xiě)回body中

Json.sign = strmd5;
pm.request.body.raw = JSON.stringify(Json);

完整代碼:

/*
    v1加密規(guī)則:
    1. 參與簽名運(yùn)算的參數(shù)選用入?yún)⒗镞卾alue非空的參數(shù)
    2. 參與簽名運(yùn)算的參數(shù)按照ASCII順序排序
    3. 組合方式:key=value通過(guò)&符連接
    4. 最后加上key=secret
    5. 使用32位md5簽名,sign的字母全大寫(xiě)
*/

/*
 * 獲取請(qǐng)求參數(shù)
 */
var Json = JSON.parse(pm.request.body);
var ts = Date.parse(new Date()) / 1000 - 10;  // 獲取時(shí)間戳
Json.ts = ts;  // 修改json

/*
 * 去除sign參數(shù)本身,然后去除值是空的參數(shù)
 */
var keys = []; // 定義key序列
// 循環(huán)遍歷JSON
for (let k in Json ){
    // 排除json中鍵位sign以及值為空的數(shù)據(jù)
    if (k == 'sign' || !Json[k]){
        continue;
    }
    keys.push(k);  // 生成篩選后的key序列
}

/*
 * 對(duì)請(qǐng)求參數(shù)排序
 */
keys.sort();

/*
 * 拼接字符串
 */
let keys_str = '';
for (let x of keys){
    keys_str += `${x}=${Json[x]}&`;  // 使用模版字符串進(jìn)行拼接
}
keys_str = keys_str + "key=a323f9b6-1f04-420e-adb9-b06ty67b0e63";

/*
 * 簽名并更新body
 */
var strmd5= CryptoJS.MD5(keys_str).toString().toUpperCase();  // 調(diào)用方法進(jìn)行md5運(yùn)算并將生成的hash序列轉(zhuǎn)換為字母全大寫(xiě)字符串
Json.sign = strmd5;  // 修改Json
pm.request.body.raw = JSON.stringify(Json);

2.JMeter

同樣在body中使用內(nèi)置函數(shù)定義時(shí)間戳ts

導(dǎo)包

import org.apache.commons.codec.digest.DigestUtils; 
import org.apache.jmeter.config.*;
import org.json.*;

獲取請(qǐng)求傳入的body,將其轉(zhuǎn)化為Json對(duì)象

// 獲取請(qǐng)求
Arguments arguments = sampler.getArguments();
// 獲取請(qǐng)求中的body內(nèi)容
Argument arg = arguments.getArgument(0);
// 獲取body的value,并將其轉(zhuǎn)化為JSONObject對(duì)象
JSONObject dataobj = new JSONObject(arg.getValue());

獲取Json的key

// 創(chuàng)建list存儲(chǔ)body中的key值
List keyArry = new ArrayList();
// 生成迭代對(duì)象
Iterator iterator = dataObj.keys(); 
// 循環(huán)key,將其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
	}
}

對(duì)list進(jìn)行排序

Collections.sort(keyArry);

字符串拼接

String str = "";
for (String s : keyArry) {
//	log.error(s);
	String value = dataObj.optString(s);
    // 剔除值為空或值為null的參數(shù)
	if (!value.equals("") && !value.equals(null)) {
		str = str+s+"="+ value+"&";
	}
}
str = str + "key=a323f9b6-1f04-420e-adb9-b06ty67b0e63";

進(jìn)行md5運(yùn)算并轉(zhuǎn)換為字母全大寫(xiě)

String sign = DigestUtils.md5Hex(str).toUpperCase();

修改json對(duì)象的sign并轉(zhuǎn)換為字符串寫(xiě)回body中

dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 轉(zhuǎn)換為字符串并歇回request-body中

完整代碼:

import org.apache.commons.codec.digest.DigestUtils; 
import org.apache.jmeter.config.*;
import org.json.*;
 
/*
 * 獲取請(qǐng)求傳入的body,將其轉(zhuǎn)化為Json對(duì)象
 */
// 獲取請(qǐng)求
Arguments arguments = sampler.getArguments();
// 獲取請(qǐng)求中的body內(nèi)容
Argument arg = arguments.getArgument(0);
// 獲取body的value,并將其轉(zhuǎn)化為JSONObject對(duì)象
JSONObject dataObj = new JSONObject(arg.getValue()); 
 
/*
 * 獲取Json的key進(jìn)行排序
 */
// 創(chuàng)建list存儲(chǔ)body中的key值
List keyArry = new ArrayList();
// 生成迭代對(duì)象
Iterator iterator = dataObj.keys(); 
// 循環(huán)key,將其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
	}
}

/*
 * 對(duì)list進(jìn)行排序
 */
Collections.sort(keyArry);
 
/*
 * 循環(huán)list中的key,讀取對(duì)應(yīng)的Value組成字符串
 */
String str = "";
for (String s : keyArry) {
	String value = dataObj.optString(s);
    // 剔除值為空或值為null的參數(shù)
	if (!value.equals("") && !value.equals(null)) {
		str = str+s+"="+ value+"&";
	}
}
str = str + "key=a323f9b6-1f04-420e-adb9-b06ty67b0e63";

/*
 * 簽名并更新body
 */
String sign = DigestUtils.md5Hex(str).toUpperCase();  // 進(jìn)行md5運(yùn)算并轉(zhuǎn)換為字母全大寫(xiě)
dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 轉(zhuǎn)換為字符串并寫(xiě)回request-body中

四、v2接口

1.Postman

將下載后的json導(dǎo)入到postman,進(jìn)入Lib install請(qǐng)求

發(fā)送請(qǐng)求,該請(qǐng)求會(huì)將bundle.js寫(xiě)入到全局變量中

獲取請(qǐng)求參數(shù)并將body的參數(shù)轉(zhuǎn)換為json對(duì)象

var Json = JSON.parse(pm.request.body);

獲取時(shí)間戳并修改json對(duì)象

var ts = Date.parse(new Date()) / 1000 - 10;
Json.ts = ts;

去除sign參數(shù)本身,然后去除值是空的參數(shù)

var keys = [];
// 循環(huán)遍歷JSON
for (let k in Json ){
    // 排除json中鍵位sign以及值為空的數(shù)據(jù)
    if (k == 'sign' || !Json[k]){
        continue;
    }
    keys.push(k);  // 生成篩選后的key序列
}

排序

keys.sort();

拼接字符串

let keys_str = '';
for (let x of keys){
    keys_str += `${x}=${Json[x]}&`;  // 使用模版字符串進(jìn)行拼接
}
keys_str = keys_str.slice(0,-1);  // 刪除最后一個(gè)&

導(dǎo)入剛才寫(xiě)入到全局變量的js

eval(pm.globals.get("pmlib_code"));

由于私鑰過(guò)長(zhǎng),所以這里把私鑰的內(nèi)容寫(xiě)到環(huán)境變量中,私鑰內(nèi)容可在pkcs8_rsa_private_key.pem查看(私鑰與公鑰可自行更換,在conf.ini中進(jìn)行配置即可)

獲取私鑰

const privatekey = pm.environment.get("privatekey");

加密

const sha256withrsa = new pmlib.rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"});  // 生成簽名對(duì)象并制定為SHA256withRSA類(lèi)型
sha256withrsa.init(privatekey);  // 初始化privatekey
sha256withrsa.updateString(keys_str);  // 更新要簽名的數(shù)據(jù)
const sign = pmlib.rs.hextob64(sha256withrsa.sign());  // 簽名并轉(zhuǎn)換為Base64字符串

修改json對(duì)象中sign并將md5對(duì)象寫(xiě)回body中

Json.sign = sign; 
pm.request.body.raw = JSON.stringify(Json);  // 將修改后的JSON轉(zhuǎn)換回字符串格式寫(xiě)回到請(qǐng)求體中

完整代碼:

/*
    v2加密規(guī)則:
    1. 參與簽名運(yùn)算的參數(shù)選用入?yún)⒗镞卾alue非空的參數(shù)
    2. 參與簽名運(yùn)算的參數(shù)按照ASCII順序排序
    3. 使用private_key簽名
    4. 使用SHA256withRSA進(jìn)行簽名
*/

/*
 * 獲取請(qǐng)求參數(shù)
 */
var Json = JSON.parse(pm.request.body);
var ts = Date.parse(new Date()) / 1000 - 10;  // 獲取時(shí)間戳
Json.ts = ts;  // 修改json

/*
 * 去除sign參數(shù)本身,然后去除值是空的參數(shù)
 */
var keys = []; // 定義key序列
// 循環(huán)遍歷JSON
for (let k in Json ){
    // 排除json中鍵位sign以及值為空的數(shù)據(jù)
    if (k == 'sign' || !Json[k]){
        continue;
    }
    keys.push(k);  // 生成篩選后的key序列
}

/*
 * 對(duì)請(qǐng)求參數(shù)排序
 */
keys.sort();

/*
 * 拼接字符串
 */
let keys_str = '';
for (let x of keys){
    keys_str += `${x}=${Json[x]}&`;  // 使用模版字符串進(jìn)行拼接
}
keys_str = keys_str.slice(0,-1);  // 刪除最后一個(gè)&

/*
 * 加密并更新body
 */
eval(pm.globals.get("pmlib_code"));  // 導(dǎo)入寫(xiě)入到全局變量的js

const privatekey = pm.environment.get("privatekey");  // 從環(huán)境變量獲取私鑰

const sha256withrsa = new pmlib.rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"});  // 生成簽名對(duì)象并制定為SHA256withRSA類(lèi)型

sha256withrsa.init(privatekey);  // 初始化privatekey
sha256withrsa.updateString(keys_str);  // 更新要簽名的數(shù)據(jù)

const sign = pmlib.rs.hextob64(sha256withrsa.sign());  // 簽名并轉(zhuǎn)換為Base64字符串

Json.sign = sign;
pm.request.body.raw = JSON.stringify(Json);

2.JMeter

同樣在body中使用內(nèi)置函數(shù)定義時(shí)間戳ts,同時(shí)添加用戶定義的變量配置元件來(lái)存放私鑰

導(dǎo)包

import org.apache.jmeter.config.*;
import org.apache.commons.codec.digest.DigestUtils; 
import org.json.*;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;

獲取請(qǐng)求傳入的body,將其轉(zhuǎn)化為Json對(duì)象

// 獲取請(qǐng)求
Arguments arguments = sampler.getArguments();
// 獲取請(qǐng)求中的body內(nèi)容
Argument arg = arguments.getArgument(0);
// 獲取body的value,并將其轉(zhuǎn)化為JSONObject對(duì)象
JSONObject dataobj = new JSONObject(arg.getValue());

獲取Json的key

// 創(chuàng)建list存儲(chǔ)body中的key值
List keyArry = new ArrayList();
// 生成迭代對(duì)象
Iterator iterator = dataObj.keys(); 
// 循環(huán)key,將其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
	}
}

對(duì)list進(jìn)行排序

Collections.sort(keyArry);

字符串拼接

String str = "";
for (String s : keyArry) {
//	log.error(s);
	String value = dataObj.optString(s);
    // 剔除值為空或值為null的參數(shù)
	if (!value.equals("") && !value.equals(null)) {
		str = str+s+"="+ value+"&";
	}
}
//刪除最后一個(gè)&
str = str.substring(0,str.length()-1);

讀取私鑰

? java中讀取私鑰需要?jiǎng)h除前面的“-----BEGIN PRIVATE KEY-----”和后面的“-----END PRIVATE KEY-----”,且需要key首尾連接中間無(wú)換行或空格。

String privateKeyString = vars.get("privateKey");  // 從用戶定義的變量中讀取私鑰
privateKeyString = privateKeyString.replace(" ", "");  // 刪除多余的空格 
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);  // 將Base64解碼轉(zhuǎn)化為字符串
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);  // 根據(jù)給定的編碼密鑰創(chuàng)建一個(gè)新的 PKCS8EncodedKeySpec
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);  // 生成RSA的私鑰對(duì)象。

創(chuàng)建 Signature 對(duì)象并初始化

Signature signature = Signature.getInstance("SHA256withRSA");  // 生成SHA256withRSA的Signature 對(duì)象
signature.initSign(privateKey);  // // 初始化簽署簽名的私鑰

更新要簽名的數(shù)據(jù)

signature.update(str.getBytes("UTF-8"));  // 更新要簽名或驗(yàn)證的字節(jié)

簽名

byte[] signatureBytes = signature.sign();  // 執(zhí)行簽名
String sign = Base64.getEncoder().encodeToString(signatureBytes);  // 將簽名結(jié)果轉(zhuǎn)換為 Base64 字符串

修改json對(duì)象的sign并轉(zhuǎn)換為字符串寫(xiě)回body中

dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 轉(zhuǎn)換為字符串并歇回request-body中

完整代碼:

import org.apache.jmeter.config.*;
import org.apache.commons.codec.digest.DigestUtils; 
import org.json.*;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
 
/*
 * 獲取請(qǐng)求傳入的body,將其轉(zhuǎn)化為Json對(duì)象
 */
// 獲取請(qǐng)求
Arguments arguments = sampler.getArguments();
// 獲取請(qǐng)求中的body內(nèi)容
Argument arg = arguments.getArgument(0);
// 獲取body的value,并將其轉(zhuǎn)化為JSONObject對(duì)象
JSONObject dataObj = new JSONObject(arg.getValue()); 

/*
 * 獲取Json的key進(jìn)行排序
 */
// 創(chuàng)建list存儲(chǔ)body中的key值
List keyArry = new ArrayList();
// 生成迭代對(duì)象
Iterator iterator = dataObj.keys(); 
// 循環(huán)key,將其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
//		log.error(key);
	}
}
// 對(duì)list進(jìn)行排序
Collections.sort(keyArry);
 
/*
 * 循環(huán)list中的key,讀取對(duì)應(yīng)的Value組成字符串
 */
String str = "";
for (String s : keyArry) {
//	log.error(s);
	String value = dataObj.optString(s);
	if (!value.equals("")) {
		str = str+s+"="+ value+"&";
	}
}
//刪除最后一個(gè)&
str = str.substring(0,str.length()-1);
 
/*
 * 讀取私鑰
 */
String privateKeyString = vars.get("privateKey");  // 從用戶定義的變量中讀取私鑰
privateKeyString = privateKeyString.replace(" ", "");  // 刪除多余的空格 
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);  // 將Base64解碼轉(zhuǎn)化為字符串
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);  // 根據(jù)給定的編碼密鑰創(chuàng)建一個(gè)新的 PKCS8EncodedKeySpec
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);  // 生成RSA的私鑰對(duì)象。

/*
 * 讀創(chuàng)建 Signature 對(duì)象并初始化
 */
Signature signature = Signature.getInstance("SHA256withRSA");  // 生成SHA256withRSA的Signature 對(duì)象
signature.initSign(privateKey);  // 初始化簽署簽名的私鑰  

// 
/*
 * 更新要簽名的數(shù)據(jù)化
 */
signature.update(str.getBytes("UTF-8"));  // 更新要簽名或驗(yàn)證的字節(jié)


/*
 * 簽名并更新body
 */
byte[] signatureBytes = signature.sign();  // 簽署所有更新字節(jié)的簽名

// 將簽名結(jié)果轉(zhuǎn)換為 Base64 字符串
String sign = Base64.getEncoder().encodeToString(signatureBytes);  // 編碼為Base64字符串

dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 轉(zhuǎn)換為字符串并歇回request-body中

總結(jié)

以上是生活随笔為你收集整理的【Postman&JMeter】使用Postman和JMeter进行signature签名的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。