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 朔望魔刃 阅读(260) 评论(0) 编辑 收藏 所属分类: java