天天看点

公共平台API鉴权安全验证

api使用签名+时间戳鉴权 请求api接口格式:/api/testserver?appid=xxx&sign=12AA12SD123SD1DSSA&timestamp=1511332935&key1=value1&key2=value2...

参数解释: appid: 由服务端分配唯一标示id 必传 确认访问身份 timestamp:当前时间戳 必传 确保访问实效性(10位的秒级时间戳) sign:签名 必传 验证接口安全防止被劫持修改参数

notice:随机数                          必传 防止接口重复提交

签名生成规则: 所有请求参数(包括appid,时间戳,随机数   ) 根据key值的字母升序排序后,以key1value1key2value2。。。的方式连接在 最后加上secretKey(由服务端分配唯一的加密参数,ps:不参与通信)组成的字符串 使用MD5加密转为大写得到sign(签名)

因为secretKey在求情过程中不参与通信,服务端通过对sign的 校验就可以防止接口被劫持修改参数,再加上时间戳保证接口的实效性。

服务端验证签名和时间戳有效后,将sign和notice存入缓存。

请求实例: 如要请求的api为 /api/getUserWalletInfo api需要传的参数为:userId

step1:生成时间戳 String timestamp= String.valueOf(new Date().getTime() / 1000); // 当前时间的时间戳 step2: 根据参数生成sign String sb= appidxxxtimestamp1511332935userId1000secretKey 然后对sb进行md5加密转为大写 得到sign step3:组合访问参数进行http请求:/api/getUserWalletInfo?appid=xxx&sign=12AA12SD123SD1DSSA&timestamp=1511332935&notice=2332&userId=100

服务端验证逻辑:

先验证appid是否合法(不合法返回400),时间戳是否有效(过期返回400),缓存中sign对应的notice是否存在(如果存在代表重复提交,如果不存在将sign和notice存入缓存。),再验证sign时候正确(不正确返回400)

签名生成与校验移步:点击打开链接