实现客户端和服务器双向的防重放攻击

实现客户端和服务器双向的防重放攻击

最近按客户的需求,需要在实现服务器防重放的前提下实现客户端的防重放机制,解决当恶意截获服务器返回数据,重复提交给客户端来反复重走交易流程,造成不安全的隐患。

所谓重放攻击,百度解释:重放攻击(Replay Attacks)又称重播攻击、回放攻击或新鲜性攻击(Freshness Attacks),是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。

现阶段我所知道的防重放有以下几种实现方式:
1. 时间戳
2. 序号
3. 挑战方式,及提问和应答

我采用了比较容易,而且容错性高的序列号方式来实现双向的防重放。具体的实现逻辑如下:
1、实现1个单例的会话管理类 SessionManager,保存一个组号和序列号,组号一般在多个会话中使用,用来记录当前会话编号,序列号记录当前组号下发送请求的编号。初始值都为0。
2、每当客户端向服务器发送请求时,客户端需要从单例中取出当前的组号、序列号,拼接在请求之前,发送给服务器,保存请求时的组号序列号,并且SessionManager组号的序列号+1;
3、服务器接收到请求,解析报文,获取组号和序列号,并且保存到本地,当接收到下次来的客户端请求时,服务器把请求中的组号序列号解析出来和本地保存的做比较,如果小于或者等于保存的序列号,那么此次的客户端请求可能为重放攻击。大于则为正常请求。
4、服务器每次接受到请求时,只会处理非重放攻击的请求,并且把客户端请求中的组号序列号拼接到响应中,一起返回给客户端。
5、客户端再接收到服务器响应后,解析报文,获取组号序列号,和请求时拼接的组号序列号对比,如果不相同,则视为重放攻击,相同时为正常响应。

你可能感兴趣的:(网络安全)