C/S架构中接入层的安全体系

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/jiange_zh https://blog.csdn.net/jiange_zh/article/details/78313532

前阵子,同事对某App与后台交互的数据进行了抓包分析,由于该App未对数据进行安全加密,因此通过抓包分析可直接获取其后台请求的接口,通过构造Http请求,爬取其App内的数据。

平日的工作里,接触的比较多的都是业务逻辑,很少关注接入层这一块,经过上面这件事,激起了我对接入层的一些兴趣,要是哪一天自己做一个App,如何能做到安全接入呢?

基础知识

1. 重放攻击

重放攻击(Replay Attacks)又称重播攻击、回放攻击,是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。攻击者可中途截获客户端的请求,并重新发送给认证服务器,从而达到认证通过的目的。

重放攻击的基本原理:把以前窃听到的数据原封不动地重新发送给接收方。

很多时候,网络上传输的数据是加密过的,此时窃听者无法得到数据的准确意义。但如果他知道这些数据的作用,就可以在不知道数据内容的情况下通过再次发送这些数据达到愚弄接收端的目的。

例如,有的系统会将鉴别信息进行简单加密后进行传输,这时攻击者虽然无法窃听密码,但他们却可以首先截取加密后的口令然后将其重放,从而利用这种方式进行有效的攻击。再比如,假设网上存款系统中,一条消息表示用户支取了一笔存款,攻击者完全可以多次发送这条消息而偷窃存款。

防御方案
(1)加随机数。该方法优点是认证双方不需要时间同步,双方记住使用过的随机数,如发现报文中有以前使用过的随机数,就认为是重放攻击。缺点是需要额外保存使用过的随机数,若记录的时间段较长,则保存和查询的开销较大。
(2)加时间戳。该方法优点是不用额外保存其他信息。缺点是认证双方需要准确的时间同步,同步越好,受攻击的可能性就越小。但当系统很庞大,跨越的区域较广时,要做到精确的时间同步并不是很容易。
(3)加流水号。就是双方在报文中添加一个逐步递增的整数,只要接收到一个不连续的流水号报文(太大或太小),就认定有重放威胁。该方法优点是不需要时间同步,保存的信息量比随机数方式小。缺点是一旦攻击者对报文解密成功,就可以获得流水号,从而每次将流水号递增欺骗认证端。
(4)挑战一应答机制。客户端请求服务器时,服务器会首先生成一个随机数,然后返回给客户端,客户端带上这个随机数,访问服务器,服务器比对客户端的这个参数,若相同,说明正确,不是重放攻击。这种方式下,客户端每次请求时,服务端都会先生成一个挑战码,客户端带上应答码访问,服务端进行比对,若挑战码和应答码不对应,视为重放攻击。

2. 数字签名&数字证书

(1)数据摘要
消息摘要算法(Message Digest Algorithm)是一种能产生特殊输出格式的算法,其原理是根据一定的运算规则对原始数据进行某种形式的信息提取,被提取出的信息就被称作原始数据的消息摘要。

著名的摘要算法有RSA公司的MD5算法和SHA-1算法及其大量的变体。

消息摘要的主要特点有:
1)无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出。
2)一般来说(不考虑碰撞的情况下),只要输入的原始数据不同,对其进行摘要以后产生的消息摘要也必定不相同,即使原始数据稍有改变,输出的消息摘要便完全不同。但是,相同的输入必会产生相同的输出
3)具有不可逆性,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息。

(2)数字签名和证书
签名和证书是成对出现的,二者不可分离。

假设Tom写信给Jack,要确保可靠通信,必须要解决两个问题:
首先,要确定消息的来源确实是Tom;
其次,要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以发觉出来。

对于消息的发送者Tom来说,先要生成一对公私钥对,将公钥给消息的接收者Jack。

如果消息的发送者Tom有一天想给消息接收者Jack发消息,在发送的信息中,除了要包含原始的消息外,还要加上另外一段消息。这段消息通过如下两步生成:
1)对要发送的原始消息提取消息摘要
2)对提取的信息摘要用自己的私钥加密

加密之后的信息摘要,就是原始信息的数字签名。

而对于信息的接收者Jack来说,他所收到的信息,将包含两个部分:
一是原始的消息内容;
二是附加的那段数字签名。

他将通过以下三步来验证消息的真伪:
1)对原始消息部分提取消息摘要,注意这里使用的消息摘要算法要和发送方使用的一致;
2)对附加上的那段数字签名,使用预先得到的公钥解密
3)比较前两步所得到的两段消息是否一致。如果一致,则表明消息确实是期望的发送者Tom发的,且内容没有被篡改过;相反,如果不一致,则表明传送的过程中一定出了问题,消息不可信。

通过这种所谓的数字签名技术,可以有效解决可靠通信的问题。如果原始消息在传送的过程中被篡改了,那么在消息接收者那里,对被篡改的消息提取的摘要肯定和原始的不一样。并且,由于篡改者没有消息发送方的私钥,即使他可以重新算出被篡改消息的摘要,也不能伪造出数字签名。
所以,综上所述,数字签名其实就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明

然而,这种数字签名方法,有一个前提,就是消息的接收者必须要事先得到正确的公钥

如果一开始Jack的公钥就被别人篡改了,那么当坏人假装Tom给你发消息时,那坏人就会被你当成Tom了,而真正的消息发送者Tom给你发的消息则会被你视作无效。

那么如何保证公钥的安全可信呢?这就要靠数字证书来解决了。

所谓数字证书,一般包含以下一些内容:

证书的发布机构(Issuer)
证书的有效期(Validity)
消息发送方的公钥
证书所有者(Subject)
数字签名所使用的算法
数字签名

可以看出,数字证书其实也用到了数字签名技术。只不过要签名的内容是消息发送方的公钥,以及一些其它信息。但与普通数字签名不同的是,数字证书中签名者不是随随便便一个普通的机构,而是要有一定公信力的机构。

因此Tom可以去找”证书中心”(certificate authority,简称CA),为他的公钥做认证。证书中心用自己的私钥,对Tom的公钥和一些相关信息一起加密,生成”数字证书”(Digital Certificate)。

之后Tom与Jack通信时,只需在签名的同时,附上数字证书,Jack在收到消息后,用CA的公钥解开数字证书,就可以拿到Tom真实的公钥了,然后就能证明”数字签名”是否真的是Tom签的。

所以,数字证书可以保证数字证书里的公钥确实是这个证书的所有者的,或者证书可以用来确认对方的身份。数字证书主要是用来解决公钥的安全发放问题。

公钥和私钥用途速记
对于加密解密,是不希望别人知道我的消息,只有我才能解密,所以公钥负责加密,私钥负责解密
对于签名,是不希望有人冒充我发消息,只有我才能发布这个签名,所以私钥负责签名,公钥负责验证

3. RSA密钥协商(密钥交换)

通过上面数字签名和数字证书的介绍,我们已经可以保证通信数据的完整性和真实性了。那么要如何保证数据的保密性呢?答案当然是加密。

加密有对称加密和非对称加密两种。一般对于数据的加密,我们采用对称加密,因为其效率高。

密钥协商机制的目的:
即使有攻击者在偷窥你与服务器的网络传输,客户端依然可以利用“密钥协商机制”与服务端协商出一个用来加密应用层数据的密钥(也称为“会话密钥”——该密钥仅在当前会话中有效)。

基于RSA的密钥协商
1) 客户端连上服务端;
2) 服务端发送CA证书给客户端;
3) 客户端验证该证书的可靠性;
4) 客户端从CA证书中取出服务端的公钥;
5) 客户端生成一个随机密钥k,并用公钥加密得到k’;
6) 客户端把k’发送给服务端;
7) 服务端收到k’后用自己的私钥解密得到k;
8) 此时双方都得到了密钥k,协商完成。

如何防范偷窥:
攻击者虽然可以监视网络流量并拿到公钥,但是无法通过公钥推算出私钥(由RSA算法保证);
攻击者虽然可以监视网络流量并拿到k’,但是攻击者没有私钥,无法解密k’,因此无法得到k;

如何防范篡改:
如果攻击者在第2步篡改数据,伪造了证书,那么客户端在第3步会发现(由证书体系保证);
如果攻击者在第6步篡改数据,伪造了k’,那么服务端收到假的k’之后,解密会失败(由RSA算法保证),服务端就知道被攻击了。

在协商完密钥之后,在同一个会话内,双方可通过该密钥进行加密和解密,从而保证数据的保密性。

4. 双向认证

双向认证是指,在客户端验证服务端身份的同时,服务端也要验证客户端的身份,服务端的服务只开放给可信的用户。

这要求每个用户都拥有证书,而获取证书的成本比较高。常规的做法是,服务端自己做CA来签发证书。

Https的双向认证流程:

这里写图片描述

接入层安全体系

1. 什么是接入层?

接入层用来桥接客户端与业务后台,是客户端通往业务后台的大门。

2. 为何需要接入层?

经典的后台三层架构:接入层、逻辑层、存储层。

从客户端的角度来看:
1) 接入层是客户端的唯一入口,客户端只需要与接入层打交道,不用理解业务后台复杂的部署细节;
2) 接入逻辑与业务逻辑解耦,客户端可以拆分为两个程序模块,既利于开发又易于维护;
3) 网络收发、协议封解、数据加解密等由接入模块统一处理,业务模块只需要写业务逻辑;
4) 业务可快速拓展,因为只需要在业务模块中添加相应的业务逻辑即可。

从服务端的角度来看:
1) 外网入口由接入层统一提供,业务后台只需部署于内网,不用应对复杂的外网环境;
2) 复杂的共性问题(如安全问题)由接入层统一处理,业务后台只需应对易变的业务需求;
3) 客户端连接由接入层统一管理。

3. 接入层的基本功能

1) 就近接入:一般情况下,同运营商近距离联网,网络质量是最好的,因此接入层需要提供就近接入服务。这就要求接入层的服务器能够部署到不同运营商、不同地区。
2) 业务分发:接入层对客户端屏蔽了业务后台的细节,客户端只需要跟接入层打交道,因此接入层需要提供业务转发能力,将业务请求真正落到相应的业务服务器上。接入层除了能够将业务转发到正确的业务服务器,还应当能够自动屏蔽异常的业务服务器,将流量切断。
3) 安全信道:在安全上,接入层需要做到防监听、防伪装、防攻击。防监听,要求对传输的数据进行加密,避免数据在网络传输过程中被坏人拿到而掌握业务数据。防伪装,要求对业务账号进行鉴权,避免坏人用非法的账号也能获取到业务数据。防攻击,主要防重放攻击,DOS攻击接入层不太现实,因为接入层冗余充足,处理能力强,攻击成本昂贵,而重放攻击针对单一业务,很有可能得手。
4) 容灾容错:接入层服务部署时要做到容灾容错。(VIP,即Virtual IP级别,IDC机房级别,地域级别等)
5) 过载保护:包括自我保护和保护他人。自我保护如超时丢包、队列丢包、拒绝服务等。保护他人如控制超时重传率,在业务后台过载时不继续添乱。

4. 安全信道

通过上面的学习,我们总结下接入层的安全信道体系:

1) 使用“密钥协商机制”来协商对数据进行加密的密钥,保证数据的保密性;
2) 使用数字签名和数据证书来做认证,保证数据的完整性和真实性;
3) 双向认证
4) 防重放检测
5) 云端会话存储,同一会话期间使用同一对称密钥,减少后台负担。

猜你喜欢

转载自blog.csdn.net/jiange_zh/article/details/78313532