七叶笔记 » java编程 » Java实现API sign签名校验的方法详解

Java实现API sign签名校验的方法详解

1. 前言

目的:为防止中间人攻击。

场景:

项目内部前后端调用,这种场景只需要做普通参数的签名校验和过期请求校验,目的是为了防止攻击者劫持请求 url 后非法请求接口。开放平台向第三方应用提供能力,这种场景除了普通参数校验和请求过期校验外,还要考虑 3d 应用的授权机制,不被授权的应用就算传入了合法的参数也不能被允许请求成功。

2. 签名生成策略

接下来详述场景 2,其实场景 1 也包含在场景 2 内部。

1.举例请求 url:

http://api.abc.com/a-service/orders?orderType=1001&requestFrom=IOS&pageNum=2&pageSize=10

请求参数为:

参数名位置备注举例X-Access-Keyheader客户端授权码,服务端提供,和 accessSecret 配对(场景 1 无此参数)app1X-Access-Tokenheader当前登录用户 tokend7b5808c3f443eb5a496225468c7e4a5X-UTCTimeheader当前发送请求时的时间2022-02-16T09:12:43.083ZX-Randomheader请求随机数341be97d9aff90c9978347f66f945b77orderTypequery订单类型1001requestFromquery订单来源IOSpageNumquery分页参数10pageSizequery分页参数2

2.设原始参数为 stringA,stringA 中添加 X-Access-Key、X-UTCTime、X-Random 固定参数,将 stringA 内非空参数值和 header 的参数按照参数名 ASCII 码从小到大排序(字典序),使用 URL 键值对的格式(即 key1=value1&key2=value2…)拼接成字符串 stringB。

注意如下规则:

参数名 ASCII 码从小到大排序(字典序);如果参数的值为空不参与签名;参数名区分大小写;验证调用返回或主动通知签名时,传送的 sign 参数不参与签名,将生成的签名与该 sign 值作校验。

3.在 stringB 最后拼接上 accessSecret (密钥) 得到 stringC 字符串,并对 stringC 进行 MD5 运算,得到 sign 值。

4.将原始的请求 url 拼接上 sign 形成最终的请求 url。

http://api.abc.com/a-service/orders?orderType=1001&requestFrom=IOS&pageNum=2&pageSize=10&sign=0f5a3cc534961d129a25d52d7ed8d003

5.最终请求 url 如下:

http://api.abc.com/a-service/orders?orderType=1001&requestFrom=IOS&pageNum=2&pageSize=10&sign=0f5a3cc534961d129a25d52d7ed8d003

参数名位置备注举例X-Access-Keyheader客户端授权码,服务端提供,和 accessSecret 配对(场景 1 无此参数)app1X-Access-Tokenheader当前登录用户 tokend7b5808c3f443eb5a496225468c7e4a5X-UTCTimeheader当前发送请求时的时间2022-02-16T09:12:43.083ZX-Randomheader请求随机数341be97d9aff90c9978347f66f945b77orderTypequery订单类型1001requestFromquery订单来源IOSpageNumquery分页参数10pageSizequery分页参数2

6.服务端 gateway 同样做 sign 签名加密和校验,如果校验不通过则说明请求非法,直接拒绝,通过则下发到业务服务进行正常请求处理。

3. API 签名算法 Java 实现

4. 测试一下

输出:

sign = 4f52eb34b30129a8d511dc803044086b

到此这篇关于Java实现API sign签名校验的方法详解的文章就介绍到这了,更多相关Java API签名校验内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章