接口安全--http数字签名

2024-06-10 23:08

本文主要是介绍接口安全--http数字签名,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了保证http请求数据的安全性和防篡改性。我们通常要对请求参数进行一些加密。
加密规则可以根据双方接口协商定义。这里举一个常用的加密协议例子。

1. sign加密协议

接口协议中通常会提供一个 appKey作为唯一的标识。
appSecret作为接入密钥。
例如:appkey=hh appSecret=39ertfefdsg406c7c36592d42022aaecc
请求路径
http://www.example.com/login
请求参数
appKey hh 合作方平台标识
username 用户名
password 密码
time Unix时间戳(10位)
sign 签名串

2. 加密要求

将筛选的参数按照第一个字符的键值ASCII码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值ASCII码递增排序,以此类推。
将排序后的参数与其对应值,组合成“参数=参数值”的格式,并且把这些参数用&字符连接起来,此时生成的字符串为待签名字符串
生成签名
sign = md5(待签名字符串)
示例
例如:
sign = md5(待签串)
参数表为:
appKey=hs,
username=lzl,
password=88fsdfgsff8fd9ssg99
time=1432432234
待签名字符串为(取排序后的结果,这里key不参与排序):
appKey=hh&password=HG20170113140431206&time=1423212323&key=密钥

3. 处理流程

我们根据加密要求,把要传送的字段进行排序和MD5加密。将加密后的结果和传输的字段一并送过去。
appKey=hh&password=HG20170113140431206&time=1423212323&key=密钥&sign=签名串。
验证方式:
如何保证这条http请求能够正常相应数据呢?提供接口方,也是根据传输的字段进行排序和MD5加密。将加密后的结果verifySign与sign进行
比较。如果相同,就说明是一个正常的请求。反之,就是以非法请求。
代码示例:

public class MD5Utils {/*** 参数签名加密* @param parameters* @param secret* @return*/public static String signRequest(TreeMap<String,String> parameters,String secret,String charset){TreeMap<String, String> treeMap = new TreeMap<>(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return o1.compareTo(o2);}});treeMap = (TreeMap<String, String>) parameters;System.out.println("升序排序结果:"+treeMap);StringBuffer sb = new StringBuffer();//把map中的集合拼接成字符串for(Map.Entry<String, String> entry:treeMap.entrySet()){String key = entry.getKey();Object value = entry.getValue();sb.append(key).append("=").append(value).append("&");}sb.append("key").append("=").append(secret);System.out.println("拼接后的字符:"+sb.toString());//进行MD5加密String sign = DigestUtils.md5Hex(getContentBytes(sb.toString(), charset));System.out.println("加密后的签名:"+sign);return sign;}/*** @param content* @param charset* @return* @throws SignatureException* @throws UnsupportedEncodingException */private static byte[] getContentBytes(String content, String charset) {if (charset == null || "".equals(charset)) {return content.getBytes();}try {return content.getBytes(charset);} catch (UnsupportedEncodingException e) {throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);}}public static void main(String[] args) {TreeMap<String,String> treeMap = new TreeMap<>();treeMap.put("appKey", "hh");treeMap.put("username", "1335288");treeMap.put("password", "435rewt32423ewt4325terw");treeMap.put("time", String.valueOf(System.currentTimeMillis()/1000));String key = "密钥";MD5Utils.signRequest(treeMap,key,"utf-8");}
}

这篇关于接口安全--http数字签名的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

详解Java如何向http/https接口发出请求

《详解Java如何向http/https接口发出请求》这篇文章主要为大家详细介绍了Java如何实现向http/https接口发出请求,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

Python如何实现 HTTP echo 服务器

《Python如何实现HTTPecho服务器》本文介绍了如何使用Python实现一个简单的HTTPecho服务器,该服务器支持GET和POST请求,并返回JSON格式的响应,GET请求返回请求路... 一个用来做测试的简单的 HTTP echo 服务器。from http.server import HT