当前位置: 首页 > news >正文

网站建设推广关键词app平台开发定制软件

网站建设推广关键词,app平台开发定制软件,wordpress多页面,快速排名刷一、前言 ​ 有些接口的请求会带上sign#xff08;签名#xff09;进行请求#xff0c;各接口对sign的签名内容、方式可能不一样#xff0c;但一般都是从接口的入参中选择部分内容组成一个字符串#xff0c;然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…一、前言 ​ 有些接口的请求会带上sign签名进行请求各接口对sign的签名内容、方式可能不一样但一般都是从接口的入参中选择部分内容组成一个字符串然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会有sign的算法描述。这里通过Postman的Pre-request Script以及JMeter的BeanShell前置处理器进行接口签名的处理。完整代码在每部分的最后 被测系统teachSignServer Gitee江苏豪之诺软件科技有限公司/KnowledgeBroadcast - Gitee.com 直接双击运行.exe文件即可密钥文件与conf.ini需要与exe处于同一文件夹下 其余工具 1.bundle.jshttps://github.com/joolfe/postman-util-lib/tree/master/postman 使用方式我们在后面使用到了再进行介绍 2.json.jar https://mvnrepository.com/artifact/org.json/json 选择适合的版本 点击bundle 将下载的jar包置于jmeter的./lib/ext下并重启jmeter 被测接口信息 接口URLMethodBody签名规则v0http://127.0.0.1:5000/api/v0/teachsignPOST{ 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进行签名v1http://127.0.0.1:5000/api/v1/teachsignPOST{ 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. 组合方式keyvalue通过符连接 4. 最后加上盐keysecretsecret在conf.ini中配置同理后面的私钥与公钥也可在其中进行配置 5. 使用32位md5进行签名sign的字母全大写v2http://127.0.0.1:5000/api/v2/teachsignPOST{ 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对象 javascript var Json JSON.parse(pm.request.body);获取所需变量并将新的时间戳更新到json对象中 javascript 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;字符串拼接 javascript var str AppKey TimeStamp Data secretKey;进行md5运算并将生成的hash序列转换为字符串 javascript var strmd5 CryptoJS.MD5(str).toString();修改json对象中sign并将md5对象写回body中 javascript Json.Sign strmd5; pm.request.body.raw JSON.stringify(Json); // 将修改后的JSON转换回字符串格式写回到请求体中完整代码 javascript /* 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位即可。 导包org.json为第三方jar包 java import org.apache.commons.codec.digest.DigestUtils; import org.apache.jmeter.config.*; import org.json.*;获取请求传入的body将其转化为Json对象 java // 获取请求 Arguments arguments sampler.getArguments(); // 获取请求中的body内容 Argument arg arguments.getArgument(0); // 获取body的value并将其转化为JSONObject对象 JSONObject dataobj new JSONObject(arg.getValue());获取变量并拼接 java 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运算 java sign DigestUtils.md5Hex(str);修改json对象的sign并转换为字符串写回body中 java dataobj.put(Sign, sign); // 修改Sign arg.setValue(dataobj.toString()); // 转换为字符串并歇回request-body中完整代码 java 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对象 javascript var Json JSON.parse(pm.request.body);获取时间戳并修改json对象 javascript var ts Date.parse(new Date()) / 1000 - 10; Json.ts ts;去除sign参数本身然后去除值是空的参数 javascript var keys []; // 循环遍历JSON for (let k in Json ){// 排除json中键位sign以及值为空的数据if (k sign || !Json[k]){continue;}keys.push(k); // 生成筛选后的key序列 }排序 javascript keys.sort();拼接字符串 javascript let keys_str ; for (let x of keys){keys_str ${x}${Json[x]}; // 使用模版字符串进行拼接 } keys_str keys_str keya323f9b6-1f04-420e-adb9-b06ty67b0e63;进行md5运算并将生成的hash序列转换为字母全大写字符串 javascript var strmd5 CryptoJS.MD5(keys_str).toString().toUpperCase();修改json对象中sign并将md5对象写回body中 javascript Json.sign strmd5; pm.request.body.raw JSON.stringify(Json);完整代码 javascript /*v1加密规则1. 参与签名运算的参数选用入参里边value非空的参数2. 参与签名运算的参数按照ASCII顺序排序3. 组合方式keyvalue通过符连接4. 最后加上keysecret5. 使用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 keya323f9b6-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 导包 java import org.apache.commons.codec.digest.DigestUtils; import org.apache.jmeter.config.*; import org.json.*;获取请求传入的body将其转化为Json对象 java // 获取请求 Arguments arguments sampler.getArguments(); // 获取请求中的body内容 Argument arg arguments.getArgument(0); // 获取body的value并将其转化为JSONObject对象 JSONObject dataobj new JSONObject(arg.getValue());获取Json的key java // 创建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进行排序 java Collections.sort(keyArry);字符串拼接 java String str ; for (String s : keyArry) { // log.error(s);String value dataObj.optString(s);// 剔除值为空或值为null的参数if (!value.equals() !value.equals(null)) {str strs value;} } str str keya323f9b6-1f04-420e-adb9-b06ty67b0e63;进行md5运算并转换为字母全大写 java String sign DigestUtils.md5Hex(str).toUpperCase();修改json对象的sign并转换为字符串写回body中 java dataobj.put(sign, sign); // 修改Sign arg.setValue(dataobj.toString()); // 转换为字符串并歇回request-body中完整代码 java 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 strs value;} } str str keya323f9b6-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请求 发送请求该请求会将bundle.js写入到全局变量中 获取请求参数并将body的参数转换为json对象 javascript var Json JSON.parse(pm.request.body);获取时间戳并修改json对象 javascript var ts Date.parse(new Date()) / 1000 - 10; Json.ts ts;去除sign参数本身然后去除值是空的参数 javascript var keys []; // 循环遍历JSON for (let k in Json ){// 排除json中键位sign以及值为空的数据if (k sign || !Json[k]){continue;}keys.push(k); // 生成筛选后的key序列 }排序 javascript keys.sort();拼接字符串 javascript let keys_str ; for (let x of keys){keys_str ${x}${Json[x]}; // 使用模版字符串进行拼接 } keys_str keys_str.slice(0,-1); // 删除最后一个导入刚才写入到全局变量的js javascript eval(pm.globals.get(pmlib_code));由于私钥过长所以这里把私钥的内容写到环境变量中私钥内容可在pkcs8_rsa_private_key.pem查看私钥与公钥可自行更换在conf.ini中进行配置即可 获取私钥 javascript const privatekey pm.environment.get(privatekey);加密 javascript 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中 javascript Json.sign sign; pm.request.body.raw JSON.stringify(Json); // 将修改后的JSON转换回字符串格式写回到请求体中完整代码 javascript /*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)); // 导入写入到全局变量的jsconst 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同时添加用户定义的变量配置元件来存放私钥 导包 java 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对象 java // 获取请求 Arguments arguments sampler.getArguments(); // 获取请求中的body内容 Argument arg arguments.getArgument(0); // 获取body的value并将其转化为JSONObject对象 JSONObject dataobj new JSONObject(arg.getValue());获取Json的key java // 创建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进行排序 java Collections.sort(keyArry);字符串拼接 java String str ; for (String s : keyArry) { // log.error(s);String value dataObj.optString(s);// 剔除值为空或值为null的参数if (!value.equals() !value.equals(null)) {str strs value;} } //删除最后一个 str str.substring(0,str.length()-1);读取私钥 ​ java中读取私钥需要删除前面的“-----BEGIN PRIVATE KEY-----”和后面的“-----END PRIVATE KEY-----”且需要key首尾连接中间无换行或空格。 java 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 对象并初始化 java Signature signature Signature.getInstance(SHA256withRSA); // 生成SHA256withRSA的Signature 对象 signature.initSign(privateKey); // // 初始化签署签名的私钥更新要签名的数据 java signature.update(str.getBytes(UTF-8)); // 更新要签名或验证的字节签名 java byte[] signatureBytes signature.sign(); // 执行签名 String sign Base64.getEncoder().encodeToString(signatureBytes); // 将签名结果转换为 Base64 字符串修改json对象的sign并转换为字符串写回body中 java dataobj.put(sign, sign); // 修改Sign arg.setValue(dataobj.toString()); // 转换为字符串并歇回request-body中完整代码 java 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 strs 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中 ​​​​​ ​​​​​​​​​​​​​​
http://www.tj-hxxt.cn/news/229424.html

相关文章:

  • 网站建设中应该注意什么自己做的网站和ie不兼容
  • 建站最好的公司排名域名服务器没有该网站的域的列表
  • 凤岗做网站新网站改关键词
  • 做网站发现是传销2017年做网站好难
  • 济南正规网站制作品牌软件定制开发哪家好
  • 手机兼职在哪个网站做上海中风险地区
  • 青海省住房和城乡建设局网站做展厅的网站
  • 济南建站培训做企业网站需要买什么资料
  • python做简单的网站服务器租用网站模版
  • 网站图片加载 优化长尾关键词排名推广
  • 哪个做网站好wordpress社交游戏
  • 杭州建设网站的公司哪家好家用电脑做网站能备案
  • 网站地图怎么做生成网站有吗免费的
  • 长沙市建网站自己做动漫 哪个网站赚钱
  • 天津网站建设多少钱外贸企业网站建设一条龙
  • 做网站数据存在哪里网站改版好吗
  • 带引导页的网站网页制作工具哪些好用
  • 正规的网站建设官网网站流程表
  • 中学生做的网站龙华做网站
  • 中国特种做业人员备案考核是什么网站网站防站
  • 郑州网站设计下载别人dede网站模版
  • 企业网站推广工具织梦 我的网站
  • 岳阳建设网站的公司网页设计与制作课程在工作中的应用
  • 深圳模板网站建设设计公司网站页头页尾怎么做浏览器缓冲设置
  • 网站开发课程设计培训中牟县建设局网站
  • 企业网站建设公司那家好可视化的网站开发工具
  • 大型电子商务网站开发架构青岛移动网站开发
  • 做旅游网站建筑企业网站设计
  • 做聚美优品网站得多少钱wordpress 4.6 中文版
  • 中核工建设集团有限公司网站网站空间域名申请网站