xiaoemo0 2020-05-04
对于web的接口的基本参数:
随机数
时间戳
使用随机数和时间戳和秘钥key生成sign值
(也可以有别的基本参数,可以自定义)
当我们发送http请求时,我们应该将随机数时间戳,以及使用随机数和时间戳和秘钥key通过AES或者MD5加密生成的sign值,传递到服务端,在服务端重复客户端的加密方式对比sign的值。(秘钥key值不用传递,是服务端和客户端共同约定的密串)(这种方式类似于微信公众号加密的方式)
以上方式的优点和弊端
使用以上的加密方式可以防止用户对数据包进行串改,但是防不住用户将网络包进行抓包,然后对接口发送大量的请求占用资源。
解决方案:
我们可以对接口进行时间上的判断,我们可以拿服务端的时间戳和客户端传来的时间戳的差值不能超过10秒,否则用户则访问不到我们的接口。
以上方式的优点和缺点
优点:
可以解决用户一直往接口发送请求。
缺点:
1由于客户端的时间戳和服务的时间戳不一定一样,这样用户可以修改客户端的时间,继续在10种内发送大量的请求。
2即使时间问题解决,用户仍旧可以在10秒以内大量的往接口发送请求。
解决方案:
对于时间问题,我们可以在服务端写一个返回时间戳的接口,返回的时间最好是毫秒。
我们可以验证完sign值后将sign存入到redis中(数据库,文件缓存,memcache中),过期时间只要比10秒中大一点即可,等下一次检测sign值之前判断redis中有无sign值,如果有说明sign已经被验证过了,说明被别人抓包了,如果没有我们在检测sign同时将sign值存入到redis中。
所以检测流程:
1先检测时间是否超过规定时间。
2检测redis中有无sign值。
3检测sign是否正确。
4对发送过来的参数进行解密。
注意:我们传递参数也可以传递使用对称加密加密后的密串,在服务端可以进行解密获取参数。我们服务端返回数据时亦可以使用对称加密,客户端收到数据后可以对密串进行解密