高可用的接口安全规范

版权声明:有问题欢迎留言,转载请声明出处 https://blog.csdn.net/larger5/article/details/85939068

一、前言

① 上线产品
② 涉及会员时长充值
③ …

这时候,权限安全就显得十分重要了,下面是公司定制的一套高可用的安全机制 v1.0
有空更新笔者的 SpringBoot 的实现代码。

二、接口安全

接口安全一般分三部分:调用方身份令牌token(验身份)、参数签名sign(防篡改)、时效性timestamp(防Doss攻击)

一、生成规则:

  1. Token:用户登录时,服务器为该用户生成身份令牌token、用于刷新token的refresh_token。token有效时间为1天,refresh_token有效时间为一个月。
    在使用过程中,所有接口都需要带该token。当token过期时,使用refresh_token获取新的token。当refresh_token也过期时,重新登录授权

refresh_token的作用是,代替先前获取token的手机号、openid、密码等敏感参数。

  1. Sign: APP请求接口时附加在url上的参数。sign = (appkey+url+所有参数按照参数名字母升序排列后键值对拼接+timestamp+appkey)
    其中,参数的拼接不包括“=、&”等特殊符号,url字段主要作用在于签名RestFul接口。

例如:接口为“http://api.acb.com/def/efg”,参数为“key1=value1&key2=value2”,则sign=md5(appkey+http://api.acb.com/def/efg+key1+value1+key2+value2+timestamp+appkey) ,注意明文拼接顺序,sign的作用是保护参数,可以只对关键参数签名。
服务端收到请求时,验证该sign是否正确,若不正确,表明数据被篡改。

  1. timstamp:服务端收到请求时,如果该时间与此时的系统时间相差很大,表示该次请求无效。

ex:https://xxxapis.xxx.com/userInfo/insertUserInfoByMobile?sign=7cbda029c0b481593ef4f1ac9be8e6c2&mobile=15111111111&timestamp=1570000000001

二、使用流程:

  1. 给每套产品,分配一个独立的appkey。(如:app_lin3hong5cun4)
  2. 获取token:用户登录时,服务端接收手机号、或第三方Openid,根据token = md5(Appkey+手机号/Openid+timestamp)计算token。
    将键值对token-user_id存于Redis,并设置该键的生存时间(如:1天)
  3. 接口检验:
    (1)用户验证:使用token查redis。若token存在表明安全,将键值中的user_id用于查询业务。若token不存在,则是伪装用户,或者过期token。返回错误码,重新获取token
    (2)签名验证:使用规则计算sign,若与接口返回的sign一致,表示参数安全,可以继续执行业务。若不一致,表示参数被改,该次请求无效,返回错误码。
    (3)验证时效性:若接口中的timestamp与系统时间相差太大,可能是攻击,直接返回错误码。

三、返回码

1、普适码

返回码 描述
200 成功
400 失败,未知错误

2、授权/令牌返回码

返回码 描述
10000 非法请求参数
10001 无权限访问
10002 token过期
10003 refresh_token过期
10004 sign 无效
10004 app_key无效
10006 timestamp参数无效
10007 访问IP不合法

猜你喜欢

转载自blog.csdn.net/larger5/article/details/85939068