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

这篇具有很好参考价值的文章主要介绍了【Postman&JMeter】使用Postman和JMeter进行signature签名。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用Postman和JMeter进行signature签名

目录
  • 使用Postman和JMeter进行signature签名
    • 一、前言
    • 二、v0接口
      • 1.Postman
      • 2.JMeter
    • 三、v1接口
      • 1.Postman
      • 2.JMeter
    • 四、v2接口
      • 1.Postman
      • 2.JMeter

一、前言

​ 有些接口的请求会带上sign(签名)进行请求,各接口对sign的签名内容、方式可能不一样,但一般都是从接口的入参中选择部分内容组成一个字符串,然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会有sign的算法描述。这里通过Postman的Pre-request Script以及JMeter的BeanShell前置处理器进行接口签名的处理。(完整代码在每部分的最后)

被测系统teachSignServer:

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

直接双击运行.exe文件即可(密钥文件与conf.ini需要与exe处于同一文件夹下)

其余工具:

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

使用方式我们在后面使用到了再进行介绍

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

选择适合的版本

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

点击bundle

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

将下载的jar包置于jmeter的./lib/ext下并重启jmeter

被测接口信息:

接口 URL Method Body 签名规则
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四个字段的值拼接,使用32位md5进行签名
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. 参与签名运算的参数选用入参里边value非空的参数
2. 参与签名运算的参数按照ASCII顺序排序
3. 组合方式:key=value通过&符连接
4. 最后加上盐key=secret(secret在conf.ini中配置,同理后面的私钥与公钥也可在其中进行配置)
5. 使用32位md5进行签名,sign的字母全大写
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. 参与签名运算的参数选用入参里边value非空的参数
2. 参与签名运算的参数按照ASCII顺序排序
3. 使用private_key签名
4. 使用SHA256withRSA进行签名

二、v0接口

1.Postman

获取请求参数并将body的参数转换为json对象

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

获取所需变量并将新的时间戳更新到json对象中

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;

进行md5运算并将生成的hash序列转换为字符串

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

修改json对象中sign并将md5对象写回body中

Json.Sign = strmd5; 
pm.request.body.raw = JSON.stringify(Json);  // 将修改后的JSON转换回字符串格式写回到请求体中

完整代码:

/* 
  vo加密规则:
  appkey,timestamp,data,secret四个字段的值拼接,使用32位md5加密
*/

/*
 * 获取请求参数
 */
var Json = JSON.parse(pm.request.body);    // 将body的参数转换为json对象 

/*
 * 获取所需变量
 */
var TimeStamp = Date.parse(new Date()) / 1000 - 10;   // 获取时间戳
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();   // 调用方法进行md5运算并将生成的hash序列转换为字符串
Json.Sign = strmd5;   // 修改JSON
pm.request.body.raw = JSON.stringify(Json);  // 将修改后的JSON写回到请求体中

2.JMeter

在JMeter的时间戳可以直接使用JMeter自带函数在body中获取,当然也可以在BeanShell前置处理器中使用代码获取

/1000是因为JMeter默认生成的时间戳为13位时间戳,我们只需要10位即可。

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

导包(org.json为第三方jar包)

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

获取请求传入的body,将其转化为Json对象

// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
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;

进行md5运算

sign = DigestUtils.md5Hex(str);

修改json对象的sign并转换为字符串写回body中

dataobj.put("Sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 转换为字符串并歇回request-body中

完整代码:

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

/*
 * 获取请求传入的body,将其转化为Json对象
 */
// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
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运算
dataobj.put("Sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 转换为字符串并写回request-body中

三、v1接口

1.Postman

​ 获取请求参数并将body的参数转换为json对象

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

获取时间戳并修改json对象

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

去除sign参数本身,然后去除值是空的参数

var keys = [];
// 循环遍历JSON
for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    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]}&`;  // 使用模版字符串进行拼接
}
keys_str = keys_str + "key=a323f9b6-1f04-420e-adb9-b06ty67b0e63";

进行md5运算并将生成的hash序列转换为字母全大写字符串

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

修改json对象中sign并将md5对象写回body中

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

完整代码:

/*
    v1加密规则:
    1. 参与签名运算的参数选用入参里边value非空的参数
    2. 参与签名运算的参数按照ASCII顺序排序
    3. 组合方式:key=value通过&符连接
    4. 最后加上key=secret
    5. 使用32位md5签名,sign的字母全大写
*/

/*
 * 获取请求参数
 */
var Json = JSON.parse(pm.request.body);
var ts = Date.parse(new Date()) / 1000 - 10;  // 获取时间戳
Json.ts = ts;  // 修改json

/*
 * 去除sign参数本身,然后去除值是空的参数
 */
var keys = []; // 定义key序列
// 循环遍历JSON
for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    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]}&`;  // 使用模版字符串进行拼接
}
keys_str = keys_str + "key=a323f9b6-1f04-420e-adb9-b06ty67b0e63";

/*
 * 签名并更新body
 */
var strmd5= CryptoJS.MD5(keys_str).toString().toUpperCase();  // 调用方法进行md5运算并将生成的hash序列转换为字母全大写字符串
Json.sign = strmd5;  // 修改Json
pm.request.body.raw = JSON.stringify(Json);

2.JMeter

同样在body中使用内置函数定义时间戳ts

导包

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

获取请求传入的body,将其转化为Json对象

// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
JSONObject dataobj = new JSONObject(arg.getValue());

获取Json的key

// 创建list存储body中的key值
List keyArry = new ArrayList();
// 生成迭代对象
Iterator iterator = dataObj.keys(); 
// 循环key,将其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
	}
}

对list进行排序

Collections.sort(keyArry);

字符串拼接

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

进行md5运算并转换为字母全大写

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

修改json对象的sign并转换为字符串写回body中

dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 转换为字符串并歇回request-body中

完整代码:文章来源地址https://www.toymoban.com/news/detail-760006.html

import org.apache.commons.codec.digest.DigestUtils; 
import org.apache.jmeter.config.*;
import org.json.*;
 
/*
 * 获取请求传入的body,将其转化为Json对象
 */
// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
JSONObject dataObj = new JSONObject(arg.getValue()); 
 
/*
 * 获取Json的key进行排序
 */
// 创建list存储body中的key值
List keyArry = new ArrayList();
// 生成迭代对象
Iterator iterator = dataObj.keys(); 
// 循环key,将其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
	}
}

/*
 * 对list进行排序
 */
Collections.sort(keyArry);
 
/*
 * 循环list中的key,读取对应的Value组成字符串
 */
String str = "";
for (String s : keyArry) {
	String value = dataObj.optString(s);
    // 剔除值为空或值为null的参数
	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();  // 进行md5运算并转换为字母全大写
dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 转换为字符串并写回request-body中

四、v2接口

1.Postman

将下载后的json导入到postman,进入Lib install请求

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

发送请求,该请求会将bundle.js写入到全局变量中

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

获取请求参数并将body的参数转换为json对象

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

获取时间戳并修改json对象

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

去除sign参数本身,然后去除值是空的参数

var keys = [];
// 循环遍历JSON
for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    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]}&`;  // 使用模版字符串进行拼接
}
keys_str = keys_str.slice(0,-1);  // 删除最后一个&

导入刚才写入到全局变量的js

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

由于私钥过长,所以这里把私钥的内容写到环境变量中,私钥内容可在pkcs8_rsa_private_key.pem查看(私钥与公钥可自行更换,在conf.ini中进行配置即可)

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

获取私钥

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

加密

const sha256withrsa = new pmlib.rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"});  // 生成签名对象并制定为SHA256withRSA类型
sha256withrsa.init(privatekey);  // 初始化privatekey
sha256withrsa.updateString(keys_str);  // 更新要签名的数据
const sign = pmlib.rs.hextob64(sha256withrsa.sign());  // 签名并转换为Base64字符串

修改json对象中sign并将md5对象写回body中

Json.sign = sign; 
pm.request.body.raw = JSON.stringify(Json);  // 将修改后的JSON转换回字符串格式写回到请求体中

完整代码:

/*
    v2加密规则:
    1. 参与签名运算的参数选用入参里边value非空的参数
    2. 参与签名运算的参数按照ASCII顺序排序
    3. 使用private_key签名
    4. 使用SHA256withRSA进行签名
*/

/*
 * 获取请求参数
 */
var Json = JSON.parse(pm.request.body);
var ts = Date.parse(new Date()) / 1000 - 10;  // 获取时间戳
Json.ts = ts;  // 修改json

/*
 * 去除sign参数本身,然后去除值是空的参数
 */
var keys = []; // 定义key序列
// 循环遍历JSON
for (let k in Json ){
    // 排除json中键位sign以及值为空的数据
    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]}&`;  // 使用模版字符串进行拼接
}
keys_str = keys_str.slice(0,-1);  // 删除最后一个&

/*
 * 加密并更新body
 */
eval(pm.globals.get("pmlib_code"));  // 导入写入到全局变量的js

const privatekey = pm.environment.get("privatekey");  // 从环境变量获取私钥

const sha256withrsa = new pmlib.rs.KJUR.crypto.Signature({"alg": "SHA256withRSA"});  // 生成签名对象并制定为SHA256withRSA类型

sha256withrsa.init(privatekey);  // 初始化privatekey
sha256withrsa.updateString(keys_str);  // 更新要签名的数据

const sign = pmlib.rs.hextob64(sha256withrsa.sign());  // 签名并转换为Base64字符串

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

2.JMeter

同样在body中使用内置函数定义时间戳ts,同时添加用户定义的变量配置元件来存放私钥

导包

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

获取请求传入的body,将其转化为Json对象

// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
JSONObject dataobj = new JSONObject(arg.getValue());

获取Json的key

// 创建list存储body中的key值
List keyArry = new ArrayList();
// 生成迭代对象
Iterator iterator = dataObj.keys(); 
// 循环key,将其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
	}
}

对list进行排序

Collections.sort(keyArry);

字符串拼接

String str = "";
for (String s : keyArry) {
//	log.error(s);
	String value = dataObj.optString(s);
    // 剔除值为空或值为null的参数
	if (!value.equals("") && !value.equals(null)) {
		str = str+s+"="+ value+"&";
	}
}
//删除最后一个&
str = str.substring(0,str.length()-1);

读取私钥

​ java中读取私钥需要删除前面的“-----BEGIN PRIVATE KEY-----”和后面的“-----END PRIVATE KEY-----”,且需要key首尾连接中间无换行或空格。

String privateKeyString = vars.get("privateKey");  // 从用户定义的变量中读取私钥
privateKeyString = privateKeyString.replace(" ", "");  // 删除多余的空格 
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);  // 将Base64解码转化为字符串
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);  // 根据给定的编码密钥创建一个新的 PKCS8EncodedKeySpec
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);  // 生成RSA的私钥对象。

创建 Signature 对象并初始化

Signature signature = Signature.getInstance("SHA256withRSA");  // 生成SHA256withRSA的Signature 对象
signature.initSign(privateKey);  // // 初始化签署签名的私钥

更新要签名的数据

signature.update(str.getBytes("UTF-8"));  // 更新要签名或验证的字节

签名

byte[] signatureBytes = signature.sign();  // 执行签名
String sign = Base64.getEncoder().encodeToString(signatureBytes);  // 将签名结果转换为 Base64 字符串

修改json对象的sign并转换为字符串写回body中

dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 转换为字符串并歇回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;
 
/*
 * 获取请求传入的body,将其转化为Json对象
 */
// 获取请求
Arguments arguments = sampler.getArguments();
// 获取请求中的body内容
Argument arg = arguments.getArgument(0);
// 获取body的value,并将其转化为JSONObject对象
JSONObject dataObj = new JSONObject(arg.getValue()); 

/*
 * 获取Json的key进行排序
 */
// 创建list存储body中的key值
List keyArry = new ArrayList();
// 生成迭代对象
Iterator iterator = dataObj.keys(); 
// 循环key,将其放入list
for (String key : iterator) {
	if (!key.equals("sign") && !key.equals("Sign")) {
		keyArry.add(key);
//		log.error(key);
	}
}
// 对list进行排序
Collections.sort(keyArry);
 
/*
 * 循环list中的key,读取对应的Value组成字符串
 */
String str = "";
for (String s : keyArry) {
//	log.error(s);
	String value = dataObj.optString(s);
	if (!value.equals("")) {
		str = str+s+"="+ value+"&";
	}
}
//删除最后一个&
str = str.substring(0,str.length()-1);
 
/*
 * 读取私钥
 */
String privateKeyString = vars.get("privateKey");  // 从用户定义的变量中读取私钥
privateKeyString = privateKeyString.replace(" ", "");  // 删除多余的空格 
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyString);  // 将Base64解码转化为字符串
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);  // 根据给定的编码密钥创建一个新的 PKCS8EncodedKeySpec
PrivateKey privateKey = KeyFactory.getInstance("RSA").generatePrivate(keySpec);  // 生成RSA的私钥对象。

/*
 * 读创建 Signature 对象并初始化
 */
Signature signature = Signature.getInstance("SHA256withRSA");  // 生成SHA256withRSA的Signature 对象
signature.initSign(privateKey);  // 初始化签署签名的私钥  

// 
/*
 * 更新要签名的数据化
 */
signature.update(str.getBytes("UTF-8"));  // 更新要签名或验证的字节


/*
 * 签名并更新body
 */
byte[] signatureBytes = signature.sign();  // 签署所有更新字节的签名

// 将签名结果转换为 Base64 字符串
String sign = Base64.getEncoder().encodeToString(signatureBytes);  // 编码为Base64字符串

dataobj.put("sign", sign);  // 修改Sign
arg.setValue(dataobj.toString());  // 转换为字符串并歇回request-body中

到了这里,关于【Postman&JMeter】使用Postman和JMeter进行signature签名的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 如同使用postman实现接口签名

    实现接口签名需要如下这些步骤: 1、获取客户的appid和appsecret并转换成appid=appidapp_secret=app_secret这样的字符串A; 2、获取接口请求参数,并参照key进行排序; 3、把请求参数转换成key1=value1key2=value2key3=value3这样的字符串B; 4、获取时间戳和nonce(一个长度为10的随机数并转成

    2024年02月06日
    浏览(31)
  • 一文解决JWT相同签名不匹配问题【JWT signature does not match locally computed signature.】

            今天做项目的时候,涉及到一个支付记账的功能,想着不能将这些金额数据显示暴露的通过常规的请求体封装来进行传输,想着要是被中途抓包修改了不就麻烦了,所以考虑到这种安全性的需求,就利用上了JWT来进行数据的封装传递,避免了被中途抓包修改的情况

    2024年02月13日
    浏览(37)
  • Blind Signature盲签名与fabric区块链结合的应用

    盲签名的概念 首先由 David Chaum 于1982年提出,盲签名实现了签名者对发送者的消息进行签名,却不能知道签名者消息的具体内容。 相当于将文件放入信封,签名者在信封上对文件进行签名,而不知道具体的文件内容。 盲签名的实现方式 盲签名的实现方式有很多,比如基于

    2024年02月03日
    浏览(36)
  • Android 给广播接收器增加权限(permission)或signature签名权限

    一. 普通权限 1.添加权限         当普通广播接收器需要增加权限时,需要在广播接收器所在的AndroidManifest.xml 文件中添加权限: 注:我查到的资料是 在广播接收器所在的AndroidManifest.xml 文件中添加permission 就行了,uses-permission是添加在广播发送方的,但在我实际调试中我发

    2024年02月07日
    浏览(63)
  • 记录一次调用奇门api报错信息Invalid signature (签名无效)

    奇门有msg对应错误的记录 我可能是 3.1   以下是还原场景 第一个方法 第二个方法 以下是运行结果 很奇怪----下第一个打印是正常的,而第二个出现 错误,我对map底层没有特别多的理解 第二个方法修正: 加入代码: 修改MapString,String参数名称为map 这样就正常了

    2024年02月22日
    浏览(50)
  • CSDN博客接口基于java调用的x-ca-signature签名算法研究

    本人业余时间会写写CSDN的博客,查看下博客数据,展现量、阅读量什么的。在“作品数据-单篇文章分析”菜单中可以看到每篇文章的总体展现量、阅读量,要是想看每篇文章每日的访问量需要再次点击列表后边的“查看详情”显示的曲线图,一个一个点击着实有些麻烦,所

    2024年02月10日
    浏览(41)
  • Jmeter-使用jmeter请求接口报401,postman能正常请求

    场景:在postman中请求接口正常,在jmeter请求相同的接口参数相同就会报错 1.postman中配置如下,是可以正常请求成功的 2.jmeter中配置如下,报401 按照上面的执行的话就会报401. 3.原因查找及解决办法: 登录系统打开F12后,发现Authorization传的内容包含Bearer,因此在jmeter中也要带

    2024年02月11日
    浏览(39)
  • 关于使用Android自带的apksigner进行进行签名

    apksigner.jar是Android自带的 工具中的命令,放在 SDK-build-tools工具中; 以往的使用 jarsigner、sign.jar的签名只支持V1签名; android 7.0以前只支持V1签名; apksigner.jar支持Android 7.0之后的V1、V2、V3、V4签名; 注意使用了V2签名之后,无法使用apk对齐方法,即zipalign命令; 所以: zipalign不

    2024年02月08日
    浏览(38)
  • 使用360进行apk加固并进行2次签名整体流程

    因新版360加固助手需要付费才能进行自动签名,故只能自己手动来签名了~ 首先选择build下该选项 选择apk 如果没有key,则点击新建 需要输入key存储的位置,key store密码,key别名(Alias),key密码,以及Certificate栏下的任一数据 成功后回到上一页,选中你的key文件,输入刚才设

    2024年02月02日
    浏览(42)
  • 接口的返回值中所需信息作为其他接口入参使用(postman与jmeter的使用)

    一、背景:  偶尔会用到一个场景,两个接口之前的调用有依赖关系,将其中一个的返回参数中的部分信息取出来作为入参在第二个接口中使用,代码内是比较好实现,只要定义一个变量,用于参数传递。 如果是测试过程中使用的的话,比如postman与jmeter的话也是可以实现,

    2024年01月21日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包