只列举一种安全性较高的思路且走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×tamp=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