关于接口的安全性,有几个重要的点。
1.参数加密
2.时间戳
3.防止重放
这篇只写思路,有经验的同志应该不需要代码,也是我懒(哈哈哈)
1.大部分的加密方式,是将发送的参数进行拼接然后加密。然后服务端同时使用相同的方式加密,看加密字符是否相等。这种的可以参考微信支付文档,有范例。关于使用什么方式加密,RSA,MD5都可以。
但是这种方式,不怀好意的人根本不需要破解你的秘钥与加密方式。我抓包获取的请求(https的请求也可以抓取,不知道请百度),重新发送就可以了,比如退款接口、提现接口就很尴尬了。
2.针对上面的情况,有人就将时间戳加入接口。1小时,1分钟后就算重发请求,时间失效了也不行。但是,但是,但是,大部分的失效设置的是1分钟左右,因为客户端、服务端时间不统一,并且也很难完全统一。比方跟金钱相关的接口,1分钟内来个100个。依然会遇到情况1的问题。
3.所以针对上面的情况,有简单的方式。将接口中加入随机字符,或者干脆把签名参数放入缓存中(只要短时间内key值不重复),相当于每个请求有相应的key。同时做到缓存失效时间比 允许时间误差稍微长一些。那么基本就ok了。
参数加密,这样第一层防护,防止简单的非正常改参数调用。
加上时间失效,防止后续 多次旧合理请求 被 不合理发送。
加上随机字符缓存作为请求key,解决合理接口一次性使用的要求。