在互联网通信过程中,我们希望传递的信息是安全的。安全主要由体现在如下几个方面:
对称加密算法使用同一个公钥进行加密和解密,而非对称加密算法使用公钥加密,私钥解密。
不俗套的我们又是经典人物Bob和Alice两个人进行通信。
如下面所示:Alice和Bob之间通过对称加密算法进行加解密。
缺陷:Alice和Bob之间使用公钥必须协商好,那么协商好的公钥要通知对方,必须经过网络传输并且不能加密(不然对方看不懂公钥内容是什么)。这里如果密钥泄露了,相当于就是明文传输,第三方可以使用泄露的密钥对Alice和Bob之间的信息进行解密。这样就不能保证信息通信中的私密性。
在上面提到的对称加密通信过程,没有解决公钥的安全传输问题,所以引入了非对称加密。
如下面所示:Alice和Bob之间通过非对称加密算法进行加解密。Alice使用Bob生成的公钥对明文进行加密,然后Bob使用自己的私钥对密文进行解密得到明文。
Bob自己生成一对公钥和私钥,私钥只有Bob知道,公钥可以让任何人知道。因此可以直接将公钥发送给Alice,被第三方截获也没有关系。
当Bob想要给Alice发送信息时,可以使用Alice生成的公钥进行加密,然后Alice使用自己的私钥进行解密。
缺陷:当有个第三方Eve使用Bob的公钥冒充Alice给Bob发送消息,那么Bob无法证明该消息是来自Alice还是Eve,这就是信息传递过程的不可否认性问题。
可以看出采用来数字签名可以达到数据完整性验证和不可否认性验证。
缺陷:前面提到的数字签名和非对称加密能够有效的前提之一是:能够可靠安全的拿到通信双方的公钥。假如Alice在给Bob发送公钥的过程中,被第三方Eve截获。Eve就可以将自己公钥发送给Bob,这样Bob以为是Alice的,使用Eve的公钥对明文加密发送给Bob,这个消息也被Eve截获,那么这个时候Eve就可以使用自己的私钥对密文进行解密,得到明文,这样消息传递的私密性就被打破了。同理,Bob给Alice传递自己公钥的过程被Eve截获,Alice发送给Bob信息的私密性也得不到保证。
注:电脑上会安装CA的公钥。
HTTP的通信是不安全的,所以后面推出了HTTPS,以SSL(SecureSocketsLayer)进行加密,这是SSL的起源。后面IETF将SSL进行标准化,1999年公布TLS(TransportLayerSecurity)1.0标准。下面我们会谈到建立安全的TSL/SSL连接涉及到的几个步骤。TLS/SSL安全协议采用非对称加密和对称加密的组合,客户端和服务器必须协商使用的算法并交换密钥信息。本文使用TLS1.2版本,TLS1.2的过程几乎与所有先前版本的SSL/TLS相同。然而,在最新版本的传输层安全协议中,这个过程得到了极大地简化。TLS/SSL建立安全连接最重要部分称为握手(handshake)。在TLS握手阶段,服务器和客户端交换用于确定连接的重要信息。下面这个例子是基于Web浏览器的握手,但对于其他TLS/SSL握手也适用。
首先,客户端向服务器发送ClientHello。ClientHello包括如下几个信息:
此时我们可以看到身份验证算法也就是我们前面提到的数字签名算法,而消息认证码算法就是我们前面提到的数字摘要算法。这里我们还未介绍的就是keyexchange算法和dataencryption算法(对称加密)。
在服务器收到客户端的Hello消息后,它会回复一个服务器Hello消息。服务器Hello消息可能包含已选取的选项(从客户端Hello提议的选项中选择),或者可能是一个握手失败的消息。
服务器现在向客户端发送一个经过签名的TLS/SSL证书,证明了其身份。它还包含服务器的公钥。客户端收到服务器的公钥,后面可以使用公钥来加密信息,发送给服务器。
在极少数情况下,服务器可能需要客户端使用客户端证书进行身份验证。如果是这样,客户端将向服务器提供其经过签名的证书。
服务器发送此消息给客户端,以确认ServerHello消息已完成。
在接收到服务器发送的ServerHelloDone消息后,客户端将发送ClientKeyExchange消息。如果服务器要求客户端证书,则在此之后发送ClientKeyExchange消息。在这个阶段,客户端创建一个pre-mastersecret。
master_secret=PRF(pre_master_secret,"mastersecret",ClientHello.random+ServerHello.random)[0..47];生成的mastersecret将作为对称加密算法的输入,用于客户端和服务器之间余下通信数据的对称加密/解密。mastersecret的长度为48字节,可以用于会话期间的加密和解密操作。
客户端和服务器创建了一个包含3个密钥的集合:
客户端和服务器将使用mastersecret生成sessionkeys,这些sessionkeys将用于加密/解密数据(对称加密)。
客户端在握手过程中的最后一条消息表示握手已经完成。这也是安全连接中的第一条加密消息。
来自服务器的握手过程的最后一条消息(已加密发送)表示握手已经完成。
从上面看到TSL/SSL握手过程中,涉及到协商的算法,身份认证(数字签名,不可否认性),消息认证码(Hash计算,数字摘要,完整性),数据加密(对称加密,私密性),数字证书(源认证)。
从客户端的角度来说:服务端可以用私钥生成数字签名,客户端可以用服务端的公钥验证签名,满足不可否认性和源认证。
对于服务端和客户端,双方可以利用协商好的密钥(sessionkeys)进行对称加密通信。满足私密性。
同时客户端和服务端,双方可以利用在握手阶段,密码套件中协商好的消息认证码算法(或者hash算法)验证数据是否被篡改,满足完整性。
所以从以上描述来说,HTTPS是一个安全的通信协议。在建立连接的过程以及后续加密通信的过程中涉及到许多加密算法以及密钥交换算法。