网络将数以千万计的机器连接在一起,环境复杂多变,所以网络攻击也是花样百出。这里,根据攻击对消息产生的影响,主要可以划分为三类:窃听、篡改、仿冒。这三种攻击方式,分别会破坏消息的私密性、完整性和通信双方的互信。针对这些攻击的特点,SSL 提供了可靠的防御策略。
1)窃听与加密
窃听,即偷听别人的谈话,在网络中意味着拦截消息并偷看其中的内容。那么,为了避免消息被别人窃听,就需要对消息进行加密。这样,即使消息被攻击者截获,他们也无法轻松获知其中的内容。
加密即按照一定的规则(加密算法)将原消息(明文)转化为对窃听者不可读的密文。通信双方共享加密的规则,所以消息接收者可以将密文再转回可读的明文。密钥是一个随机字符串,是加密及解密不可或缺的元素。发送者使用密钥对明文加密,接收者使用密钥对密文解密。
通信双方可以共享一个相同的密钥,用于加密和解密。这称为对称加密或者秘密密钥加密。这种方法的优势是速度快,劣势是难以安全的传递密钥,特别是有很多通信对象时。要安全的将密钥交到通信方,你需要和每一个人见面。为了解决这个问题,就出现了不对称加密或者公共密钥加密。使用这种方法,每一个通信对象都有一个密钥对:公钥和私钥。发送者使用对方的公钥加密,接收者使用自己的私钥解密。因为公钥是公开的,这就解决了密钥传递的问题。但是,也造成了一些性能的损失。在实际的应用中,为了避免密钥传递问题同时保证性能,通常使用不对称加密来交换密钥,然后使用对称加密传输数据。
加密是一个非常重要,也非常活跃的研究领域,有非常多的加密算法。例如,数据加密标准(DES),三重 DES,RC2 和 RC4 等。
2)篡改与消息摘要
篡改是指攻击者拦截并修改消息的内容。加密不能避免消息被修改,接收者也无法判断消息是否被修改过。这里,就需要用到消息摘要(Message Digest)技术。消息摘要是一个表示消息特征的定长字符串。它有两个重要的特征:不可逆性和抗冲突性。不可逆性是指从消息可以计算出消息概要,但是从消息摘要基本不可能得到消息;抗冲突性是指要想产生具有相同摘要值的两条消息是相当困难的。这两个特性,使消息摘要可以用来验证消息的完整性。发送者使用摘要算法计算出消息摘要,并随同消息发送给对方;接收者收到消息以后,同样会根据消息计算出消息摘要 , 并和收到的摘要对比。如果两者相同,则表示消息没有被篡改。
在实际应用中,消息摘要很少被单独使用,通常用于数字签名和消息认证码(MAC)。消息认证码是基于消息和密钥生成的消息摘要。它在验证完整性同时,可以在一定程度上完成用户验证功能。数字签名是经过加密的消息摘要。
(PS:似乎就是消息被篡改了我必须知道,从而发现并处理这个篡改事件)
3)仿冒与数字证书
仿冒即假冒别人进行通信。消息认证码可以用来验证消息的发送者。数字签名则更进一步,具有不可抵赖性。因为数字签名是使用发送者私钥加密的消息摘要,只有发送者才能产生。这一切似乎都很完美,使用加密防止窃听,使用摘要防止篡改,使用数字签名防止仿冒,似乎不要什么数字证书。
事实当然不是这样,下面的攻击方式将瓦解以上所有的防线。这就是中间人攻击(man-in-the-middle attack)。在通信双方交换公钥的过程中,攻击者拦截双方的公钥,并将自己的密钥发送给通信双方。这样,通信双方就会使用攻击者的密钥加密。在这样情况下,所有的加密、签名都失效了。中间人攻击细节如下图所示:
图 1.中间人攻击
从上图可以看出,第 1, 2, 3, 4 步是公钥交换过程。在此过程中,攻击者获得了发送方和接收方的公钥,而将自己的公钥发送给通信双方。第 5, 6, 7, 8 步是发送消息的过程。在此过程中,发送方和接收方都是用攻击者公钥加密,而攻击者截获数据后重新使用通信双方公钥加密,这就使双方难以察觉攻击者的存在。
要防范中间人攻击,就需要使用数字证书,这里,数字证书主要指由专门的证书颁发机构(CA)授权的证书,称为 CA 证书。CA 证书将证书属主信息和公钥绑定到一起。证书颁发机构负责验证证书申请者的身份信息。通过可信的第三方(CA),通信方可以向任何人证明其拥有的公钥,其他人也可以通过 CA 验证其证书真伪,这就阻止了中间人攻击。CA 证书一般包含所有者的公钥 , 所有者的专有名称 , 签发证书的 CA 的专有名称 , 证书开始生效的日期 , 证书过期日期等信息。
与 CA 证书相对应的,还有自签署证书。
自签署证书一般用在测试环境中。在后面的章节中,会使用自签署证书实现基于 SSL 的安全连接。
SSL 握手
SSL 连接实现主要分为两部分:SSL 握手和数据传输。前者使用 SSL 握手协议建立连接,后者使用记录协议传输数据。这里,主要介绍 SSL 握手流程。握手是 SSL 客户端和 SSL 服务器端完成认证,并确定用于数据传输的加密密钥的过程。这里,SSL 客户端是指主动发起连接的一端,不要和 MQ 客户端混淆。SSL 握手具体流程如下:
- SSL 客户端发送“Hello”消息给 SSL 服务器端,并列出客户端所支持的 SSL 版本、加密算法和摘要算法。在实际应用中,一般将加密算法和摘要算法结合到一起,组成一个加密套件。同时,客户端还会发送一个随机数,用于以后产生加密密钥。
- SSL 服务器端对客户端的连接请求作出回应。从客户端提供的加密套件列表中,选择要使用的加密套件,并产生另外一个随机数。同时,服务器端会发送自己的数字证书给客户端,里面包含服务器端的认证信息及公共密钥。如果服务器端需要验证客户端,它还会在消息中包含要求客户端提供数字证书的请求。
- 客户端收到服务器端的回应。它首先使用 CA 证书验证服务器端证书的有效性。在此过程中,客户端会检查证书的签名、证书认证路径、有效日期、证书状态等。验证通过后,抽取出其中的公钥。客户端产生另外一个随机数,并使用服务器端的公钥加密后发送给服务器端。
- 如果服务器端要求客户端提供证书,客户端会将随机数用私钥加密,连同证书发送给服务器端。服务器端对客户端的证书进行验证,并使用客户端的公钥解密收到的随机数。
- 服务器端和客户端基于前面提供的随机数,计算出用于数据加密的共享密钥。
- 客户端将所有握手消息的 MAC 值发送给服务器端,服务器端也将所有握手消息的 MAC 值发送给客户端。这么做是为了防止攻击者在握手过程中篡改了消息内容。
- 客户端和服务器端使用握手过程中产生的加密密钥交换握手结束消息。握手结束,SSL 连接建立。
在 SSL 连接建立后,将开始遵循记录协议对数据进行传输。
SSL协议的三个特性
① 保密:在握手协议中定义了会话密钥后,所有的消息都被加密。
② 鉴别:可选的客户端认证,和强制的服务器端认证。
③ 完整性:传送的消息包括消息完整性检查(使用MAC)。
2、记录协议
记录协议在客户机和服务器握手成功后使用,即客户机和服务器鉴别对方和确定安全信息交换使用的算法后,进入SSL记录协议,记录协议向SSL连接提供两个服务:
(1)保密性:使用握手协议定义的秘密密钥实现
(2)完整性:握手协议定义了MAC,用于保证消息完整性
记录协议的过程:
3、警报协议
客户机和服务器发现错误时,向对方发送一个警报消息。如果是致命错误,则算法立即关闭SSL连接,双方还会先删除相关的会话号,秘密和密钥。每个警报消息共2个字节,第1个字节表示错误类型,如果是警报,则值为1,如果是致命错误,则值为2;第2个字节制定实际错误类型。