随笔-95  评论-31  文章-10  trackbacks-0
只列举一种安全性较高的思路且走HTTP

1: 客户端登录,服务端返回api-key和securekey。 ----> api-key一般与用户id关联唯一性,同时自定义生成securekey放入缓存中且返回给客户端(客户端需保存)
2: 客户端发起请求,参数包括:
      1) api-key
      2) 请求参数
      3) 时间戳, 这个参数的目的是防止请求被人拦截模拟再次发送,也即过滤使用相同的连接和参数进行重复请求
      4) 请求参数的sign签名(就是把参数和参数值,结合securekey、时间戳进行加密且返回全大写的字符串,实际传输中并不传递securekey)  -->加密方式需和服务端协商保持一致

      示例: GET请求链接:   http://192.168.1.22:8080/v1/info/list?apiKey=api-key&id=2&name=xx&sign=EFSDKJXNDSF&timestamp=15909090213989

 3:服务端接收后:
      1) 根据api-key获取securekey取得参数;这里可判断securekey的失效时间,若失效,直接拦截请求提示用户重新登录。
      2) 根据时间戳与当前服务端时间比较,可自定义判断,比如大于2分钟就判断是恶意重复请求,直接拦截不进入业务处理,若在2分钟内,表示可以重复发起相同的请求。
      3) 按照客户端的请求参数结合securekey、时间戳进行加密(方式与客户端一致) 。
      4) 然后与sign签名进行比较,如果一致,表示是安全的用户请求,如果不一致,表示被拦截那么禁止进入业务。

时间戳的再次说明:时间戳的目的就是如果被人恶意拦截模拟重复发起请求,比如上面的完整GET请求链接,这里被拦截后只能进行恶意的重复请求。因为若修改参数在发送,那么服务端根据参数加密生成的签名肯定与客户端签名不一致,是无法通过认证的,只能利用原有参数重复发送,那么时间戳就能保护系统不被恶意大量的重复攻击。服务端获取时间戳可加入判断规则,与当前系统时间比较,若大于多少分钟,就判定为重复请求,进行拦截,若小于多少分钟,那么仍然可以请求。


完!


posted on 2018-01-19 16:04 朔望魔刃 阅读(420) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: