接口安全--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

相关文章

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Python WSGI HTTP服务器Gunicorn使用详解

《PythonWSGIHTTP服务器Gunicorn使用详解》Gunicorn是Python的WSGI服务器,用于部署Flask/Django应用,性能高且稳定,支持多Worker类型与配置,可处... 目录一、什么是 Gunicorn?二、为什么需要Gunicorn?三、安装Gunicorn四、基本使用启

基于Redisson实现分布式系统下的接口限流

《基于Redisson实现分布式系统下的接口限流》在高并发场景下,接口限流是保障系统稳定性的重要手段,本文将介绍利用Redisson结合Redis实现分布式环境下的接口限流,具有一定的参考价值,感兴趣... 目录分布式限流的核心挑战基于 Redisson 的分布式限流设计思路实现步骤引入依赖定义限流注解实现

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.