image.png

防伪装攻击-Token机制

  • 防伪装攻击:即防止接口被其他人调用,此阶段可以理解为比如已经登录了,然后在请求其他接口的时候,通过Token授权机制来判断当前请求是否有效

  • 用户用密码登录或者验证码登录成功后,服务器返回token(通常UUID)给客户端,并将Token-UserId以键值对的形式存放在缓存服务器中。

  • 客户端将token保存在本地,发起后续的相关请求时,将token发回给服务器;
  • 服务器检查token的有效性,有效则返回数据,若无效,分两种情况:
    1. token错误,这时需要用户重新登录,获取正确的token
    2. token过期,这时客户端需要再发起一次认证请求,获取新的token(具体的看服务端和客户端怎么约定处理)

安全隐患:Token被劫持:被劫持之后,可以伪造请求(重放攻击)和篡改参数(篡改攻击)

防重放攻击-timestamp和nonce机制

  • 重放攻击:所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。比如黑客通过抓包获取到了请求的HTTP报文,然后黑客自己编写了一个类似的HTTP请求,发送给服务器

  • 基于时间戳-timestamp

每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。
例如:
http://baidu.com/index/Info?uid=ZX07&stime=14232323&sign=128728364892304dhfj92932
如果黑客修改stime参数为当前的时间戳,则sign参数对应的数字签名就会失效,因为黑客不知道token值,没有办法生成新的数字签名

安全隐患:如果是在60s之内进行重放攻击,那就没办法了,所以这种方式不能保证接口被多次调用。

  • 基于nonce

nonce(Number once)的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,服务端会把每一次请求的nonce保存到数据
工作流程:每次处理HTTP请求时,首先判断该请求的nonce参数是否在服务端数据库中,如果存在则认为是非法请求
例如:
http://baidu.com/index/Info?uid=ZX07&nonce=53sdkjskd&sign=128728364892304dhfj92932
nonce参数在首次请求时,已经被存储到了服务器上的“集合”中,再次发送请求会被识别并拒绝。 nonce参数作为数字签名的一部分,是无法篡改的,因为黑客不清楚token,所以不能生成新的sign。

存在问题: 那就是对服务器来说永久存储所有接收到的nonce的代价是非常大的

  • 最佳解决方案:基于timestamp和nonce

nonce的一次性可以解决timestamp参数时间限制的问题,timestamp可以解决nonce参数在数据库“集合”越来越大的问题。在timestamp方案的基础上,加上nonce参数,因为timstamp参数对于超过60s的请求,都认为非法请求,所以我们只需要存储60s的nonce参数的“集合”即可

如果在60s内,重放该HTTP请求,因为nonce参数已经在首次请求的时候被记录在服务器的nonce参数“集合”中,所以会被判断为非法请求。 超过60s之后,stime参数就会失效,此时因为黑客不清楚token的值,所以无法重新生成签名。

防篡改攻击-签名机制

  • signature(签名) = MD5算法(token+timestamp+nonce+业务参数)

将“API接口中的token、timestamp、nonce、业务参数”进行MD5算法加密,加密后的数据就是本次请求的签名signature,服务端接收到请求后以同样的算法得到签名,并跟当前的签名进行比对,如果不一样,说明参数被更改过,直接返回错误标识。

具体流程

  • 请求参数包括token、timestamp、nonce、业务参数、客户端signature(签名)
  • 将token、timestamp、nonce、业务参数以字母升序(A-Z)排序,按’key1=value1’+ ‘&’ + ‘key2=value2’连接所有参数得到字符串signStr
  • 将字符串signStr进行MD5运行得到新的签名newSignature
  • newSignature和客户端发送的signature做比较