何为重放攻击攻击?
重放,即重复发送。指攻击人利用网络监听或其它方式抓到正常请求数据包,然后使用这个已经被服务器成功接收过的数据包,原封不动的再次发送给服务器,以达到欺骗服务器的目的。最终实现非法操作。
举例:
假设有这样一个登录接口:http://www.domain.com/login.do?username=zhangsan&password=md5(password)
虽然这个登录接口的 username 和 password 是经过一些加密机制加密过的,攻击者不能解密出明文。但攻击者只要抓到这个请求包,并在某个时间点再次提交到服务器时,由于请求数据并没有改变,服务器判断 username 和 password 是对的,这样就登录成功了。
攻击者通过登录后,就可以继续做那些需要登录才能做的操作了,比如:获取用户敏感信息,转账。。。
如何防重放?
防重放的核心就是不要让接口参数可以多次调用,在拿到提交的参数到执行业务逻辑之前要加相关校验。
如上述例子参数:username=zhangsan&password=md5(password),密码是直接 md5 加密的。我们可以将密码加密后再加盐:username=zhangsan&password=md5(password)+ 盐值,这个盐值可以是随机数和时间戳的组合,随机数由服务器在打开页面时返回,并记住这个随机数(比如保存在 session 中)。
服务器接收到 password 参数,获取盐值,并解析出里面的随机数和时间戳。首先判断时间戳是否在一定范围内,如果不在表示可能是攻击请求,直接拒绝;然后判断这个请求上来的随机数和服务器记住的随机数是否一致,不一致也拒绝请求。最后再执行业务逻辑(校验账号密码)。
总结
最后,再次提醒要使用 HTTPS 协议,使用 HTTP 很容易被监听到数据。