网络请求参数加签处理

2023-10-14 20:10

本文主要是介绍网络请求参数加签处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网络请求的中,有的数据是敏感数据,需要加密处理,同时为了防止数据在网络请求过程中被窜改,可以通过加签的形式进行处理,即把关键的参数进行拼接再加上一个秘钥(可以是登录操作时获取并存在本地的),形成一个新的字符串,然后对字符串进行MD5加密,得到一个签,连同请求参数一起传给后台,后台也用同样的方法生成一个签,进行比对,如果一样说明数据没有变动,如果不一样,说明数据在网络请求过程中被改动。


public class RequestHandler {protected static final String CHARSET = "UTF-8";/*** 描述:创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名*/public static String createSign(Map<String, String> param) {SortedMap packageParams = new TreeMap<String, String>(param);StringBuffer sb = new StringBuffer();Set<Entry<String, String>> es = packageParams.entrySet();Iterator<Entry<String, String>> it = es.iterator();while (it.hasNext()) {Entry<String, String> entry = (Entry<String, String>) it.next();String k = (String) entry.getKey();String v = (String) entry.getValue();if (!TextUtils.isEmpty(v) && !"sign".equals(k)) {sb.append(k + "=" + v + "&");}}String str = MD5Util.hmacSign(sb.substring(0, sb.length() - 1), HSDApplication.getOption());String sign = TextUtils.isEmpty(str) ? "" : str.toUpperCase();return sign;}/*** 描述:特殊字符处理*/private static String UrlEncode(String src) {try {return URLEncoder.encode(src, CHARSET).replace("+", "%20");} catch (UnsupportedEncodingException e) {e.printStackTrace();return "";}}static  class MD5Util {public static final String ENCODE = RequestHandler.CHARSET;public static String hmacSign(String aValue, String aKey) {byte k_ipad[] = new byte[64];byte k_opad[] = new byte[64];byte keyb[];byte value[];try {keyb = aKey.getBytes(ENCODE);value = aValue.getBytes(ENCODE);} catch (UnsupportedEncodingException e) {keyb = aKey.getBytes();value = aValue.getBytes();}Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);Arrays.fill(k_opad, keyb.length, 64, (byte) 92);for (int i = 0; i < keyb.length; i++) {k_ipad[i] = (byte) (keyb[i] ^ 0x36);k_opad[i] = (byte) (keyb[i] ^ 0x5c);}MessageDigest md = null;try {md = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}md.update(k_ipad);md.update(value);byte dg[] = md.digest();md.reset();md.update(k_opad);md.update(dg, 0, 16);dg = md.digest();return MD5Util.toHex(dg);}private static String toHex(byte input[]) {if (input == null)return null;StringBuffer output = new StringBuffer(input.length * 2);for (int i = 0; i < input.length; i++) {int current = input[i] & 0xff;if (current < 16)output.append("0");output.append(Integer.toString(current, 16));}return output.toString();}}
}

如上方法中,将需要做加签处理的参数组成map对象,传递动createSign方法中,得到一个签,并在网络请求中将其当做参数传递给后台即可



这里涉及到一个问题,即参数自动排序,如aa=123,和ab=456,de =789,三个参数需要按照一定顺序排序,让后台的程序也能按照同样的顺序排序,从而保证结果不变。 如果每一个网络请求单独去拼接字符串就太麻烦了 ,所以要用统一的处理方式。 

这里使用的是SortedMap


SortedMap接口是排序接口,只要是实现了此接口的子类,都属于排序的子类,TreeMap是SortedMap接口的基于红黑树的实现。此类保证了映射按照升序顺序排列关键字, 根据使用的构造方法不同,可能会按照键的类的自然顺序进行排序(参见 Comparable), 或者按照创建时所提供的比较器进行排序。 。SortedMap接口的定义如下:

public interface SortedMap<K,V>  
extends Map<K,V> 

保证按照键的升序排列的映射,可以按照键的自然顺序(参见 Comparable 接口)进行排序, 或者通过创建有序映射时提供的比较器进行排序。对有序映射的集合视图 (由 entrySet、keySet 和 values 方法返回)进行迭代时,此顺序就会反映出来。
 要采用此排序,还需要提供一些其他操作(此接口是相似于 SortedSet 接口的映射)。
 插入有序映射的所有键都必须实现 Comparable 接口(或者被指定的比较器所接受)。
 另外,所有这些键都必须是可互相比较的:k1.compareTo(k2)(或 comparator.compare(k1, k2)) 对有序映射中的任意两个元素 k1 和 k2 都不得抛出 ClassCastException。
 试图违反这些限制将导致违反方法或者构造方法的调用,从而抛出 ClassCastException。
 注意,如果有序映射正确实现了 Map 接口,则有序映射所保持的顺序(无论是否明确提供了比较器)都必须保持相等一致性。
 (相等一致性 的精确定义请参阅 Comparable 接口或 Comparator 接口)。
 这也是因为 Map 接口是按照 equals 操作定义的,但有序映射使用它的 compareTo(或 compare)方法对所有键进行比较, 因此从有序映射的观点来看,此方法认为两个对象拥有相等的映射键则说明它们是相等的。
 即使顺序没有保持相等一致性,树映射的行为仍然是 定义良好的,只不过没有遵守 Map 接口的常规协定。
 所有通用有序映射实现类都应该提供 4 个“标准”构造方法:
 1) void(不带参数)构造方法,创建空的有序映射,按照键的自然顺序 排序。
 2) 带有一个 Comparator 类型参数的构造方法,创建一个空的有序映射,根据指定的比较器排序。
 3) 带有一个 Map 类型参数的构造方法,创建一个键-值映射关系与参数相同的有序映射,按照键的自然顺序排序。
 4) 带有一个有序映射类型参数的构造方法,创建一个新的有序映射,键-值映射关系及排序方法与输入的有序映射相同。如:TreeMap(SortedMap<K,? extends V> m) 
 除了 JDK 实现(TreeMap 类)遵循此建议外,无法保证强制实施此建议(因为接口不能包含构造方法)。
SortedMap声明的接口


在此接口上定义了一些Map中没有的方法,表13-14  SortedMap接口扩展的方法

 






这篇关于网络请求参数加签处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/212843

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

4B参数秒杀GPT-3.5:MiniCPM 3.0惊艳登场!

​ 面壁智能 在 AI 的世界里,总有那么几个时刻让人惊叹不已。面壁智能推出的 MiniCPM 3.0,这个仅有4B参数的"小钢炮",正在以惊人的实力挑战着 GPT-3.5 这个曾经的AI巨人。 MiniCPM 3.0 MiniCPM 3.0 MiniCPM 3.0 目前的主要功能有: 长上下文功能:原生支持 32k 上下文长度,性能完美。我们引入了

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了