网络请求参数加签处理

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

相关文章

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -

使用C++将处理后的信号保存为PNG和TIFF格式

《使用C++将处理后的信号保存为PNG和TIFF格式》在信号处理领域,我们常常需要将处理结果以图像的形式保存下来,方便后续分析和展示,C++提供了多种库来处理图像数据,本文将介绍如何使用stb_ima... 目录1. PNG格式保存使用stb_imagephp_write库1.1 安装和包含库1.2 代码解

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep

Spring Boot 整合 ShedLock 处理定时任务重复执行的问题小结

《SpringBoot整合ShedLock处理定时任务重复执行的问题小结》ShedLock是解决分布式系统中定时任务重复执行问题的Java库,通过在数据库中加锁,确保只有一个节点在指定时间执行... 目录前言什么是 ShedLock?ShedLock 的工作原理:定时任务重复执行China编程的问题使用 Shed

Redis如何使用zset处理排行榜和计数问题

《Redis如何使用zset处理排行榜和计数问题》Redis的ZSET数据结构非常适合处理排行榜和计数问题,它可以在高并发的点赞业务中高效地管理点赞的排名,并且由于ZSET的排序特性,可以轻松实现根据... 目录Redis使用zset处理排行榜和计数业务逻辑ZSET 数据结构优化高并发的点赞操作ZSET 结

微服务架构之使用RabbitMQ进行异步处理方式

《微服务架构之使用RabbitMQ进行异步处理方式》本文介绍了RabbitMQ的基本概念、异步调用处理逻辑、RabbitMQ的基本使用方法以及在SpringBoot项目中使用RabbitMQ解决高并发... 目录一.什么是RabbitMQ?二.异步调用处理逻辑:三.RabbitMQ的基本使用1.安装2.架构

一文详解Python中数据清洗与处理的常用方法

《一文详解Python中数据清洗与处理的常用方法》在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战,本文总结了多种数据清洗与处理方法,文中的示例代码简洁易懂,有需要的小伙伴可以参考下... 目录缺失值处理重复值处理异常值处理数据类型转换文本清洗数据分组统计数据分箱数据标准化在数据处理与分析过

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Python调用另一个py文件并传递参数常见的方法及其应用场景

《Python调用另一个py文件并传递参数常见的方法及其应用场景》:本文主要介绍在Python中调用另一个py文件并传递参数的几种常见方法,包括使用import语句、exec函数、subproce... 目录前言1. 使用import语句1.1 基本用法1.2 导入特定函数1.3 处理文件路径2. 使用ex

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,