Java数字签名校验

最近工作中有使用到数字签名校验来验证API请求是否被劫持,从而保证数据安全,特此记录便于日后查阅。

1、签名校验流程图

Java数字签名校验_第1张图片

功能介绍:

用户通过签名来保护数据安全,后端通过比较前端传过来的签名是否相同,来判断数据是否被他人篡改。

处理流程

1、用户发起请求到应用接入网关(AG),进入签名校验过滤器;

2、签名校验过滤器获取参数中的appid,通过appid到redis中获取secretkey,如果secretkey为空则请求失败;

3、使用secretkey对组合后的串值进行md5加密,将加密后的签名与参数中的签名进行比对,如果两者签名不一致则请求失败;

4、签名比对成功后进入下一个过滤器,校验成功则转发请求到目标服务做业务处理;

5、如果业务处理阶段发生异常则在应用接入网关中做统一异常处理。

2、应用请求签名验证方式(不带Token请求)

业务请求具体参数如下:

参数名

类型

是否必填

描述

appid

String

应用ID

methodname

String

方法名称

param

Json

参数

sign

String

签名(注意:${secretkey}代表密钥)

md5(appid=123&methodname=gettengininfo&param=jsonstring${secretkey}

timestamp

long

请求时间戳(允许10分钟误差)

3、应用请求签名验证方式(带Token请求)

参数名

类型

是否 必填

描述

appid

String

应用ID

methodname

String

方法名称

param

Json

参数

Token

String

Token

sign

String

签名(注意:${secretkey}代表密钥)

md5(appid=123

&methodname=gettengininfo

&param=jsonstring

×tamp=111111999

&token=4be038283c70e81f23577f79e1195cb${secretkey}

timestamp

long

请求时间戳(允许10分钟误差)

4、请求示例

请求参数:
{
    "appid": "5DF7406B-3E3C-2CD3-B71F-3634DA8C8CD",
    "methodname": "gettengineinfo",
    "param": "{api_version:\"1.0\",ip:\"119.4.5.119\"}",
    "timestamp": 1845689403,
    "token": "5df7406b3e3c2cd3b71f3634da8c8cd1",
    "sign": "3750366E3B606B9285C2A79905C2A5FA"
}


通过appid获取对应的密钥(密钥是双方事先约定好的):
secretkey=05575642-FC0D-4331-AF23-956E0ED14B45

组合的将要进行MD5加密的字符串(注:参数名转为小写后排序后再组合)
appid=5DF7406B-3E3C-2CD3-B71F-3634DA8C8CD &methodname=gettengineinfo¶m={api_version:"1.0",ip:"119.4.5.119"}×tamp=1845689403&token=5df7406b3e3c2cd3b71f3634da8c8cd105575642-FC0D-4331-AF23-956E0ED14B45

拿以上字符串做md5加密,加密后的结果(32位大写字符)是:
89849DA0A12BE1674C25C5DC628426EE

每个用户都持有一个appid,每个appid都对应一个secretkey作为签名加密的密钥,这个密钥如果泄露了也没有关系,是可以修改的,组合后串值的顺序是key从小到大排序得到的。

这篇文章目的主要是记录签名生成规范,到此Java数字签名介绍完成。

你可能感兴趣的:(Java加解密算法,JWT)