不安全的HTTP
我们每天接触的互联网并不是一个绝对安全的存在,在进行网络活动时,我们的个人信息有可能被恶意盗取,接收到的内容或许被第三方修改过,正在访问的站点也可能根本就是个冒牌货。这些不安全的因素归因于HTTP协议所依赖的TCP/IP网络模型。HTTP是应用层协议,位于TCP/IP协议栈的顶层。用户数据想要送达到目标主机就需要向下依次经由传输层、网络层、数据链路层,层层封装后最终通过物理层传输二进制流至目的地。而恰恰在这些层中都未对数据进行加密处理,一旦别有用心之人获取到传输中的数据包,其中内容便唾手可得。 所以,要想我们的数据变得“安全”无非两种办法,一是让“第三者”得不到,二是即便搞到手,但是看不懂。第一种方式貌似实现起来困难有点大,所以还是第二种更靠谱,对传输的数据进行特定的加密处理就能实现。
数据加密
所谓数据加密,就是将一段数据处理成无规则的数据,除非有关键的密钥,否则谁也无法得知无规则数据的真实含义。
在密码学中,用于数据加密的算法主要有两种,即 对称加密算法 和 非对称加密算法
对称加密算法
一般是通过一个算法和一个密钥(secret key)对明文(plaintext)进行处理,得到的不规则字符就是密文(ciphertext)
非对称加密算法
非对称加密算法(也称公开密钥算法)不是一个算法而是一组算法,它与对称密钥算法的异同点如下:
-
功能不一样
对称加密算法主要用于加密解密,而非对称密钥算法可以进行加解密、密钥协商、数字签名。
-
密钥是一对
对称密钥算法中的密钥是一个数字,且加解密使用同一个密钥。非对称加密算法的密钥可以部分公开,密钥是一对,分为公钥和私钥,公钥加密的内容需要用私钥解密,私钥加密的内容需要用公钥解密。一般私钥由服务器持有且不可泄露,任何人均可持有公钥。
-
运算速度慢
相比于对称加密算法,非对称加密算法的运算速度要慢很多。所以非对称加密算法一般用于密钥协商或者数字签名,因为运算的数据较少。
CA证书和CA机构
正如身份证是证明我们身份的凭证一样,服务器也需要一个类似的凭证来证实其身份和可信度。数字证书的目的就在于此。CA证书是由数字证书颁发的权威机构(CA机构)负责颁发。获取证书前,服务器需要先向CA机构提交基本信息(包括服务器自己的公钥)申请证书,CA机构审核通过后就会为其颁发证书,证书中会包含服务器在申请时提交的公钥。客户端在拿到服务器的证书后就可以根据证书中包含的服务端信息验证服务器的合法性,比如域名是否一致、证书是否过期等等,并可通过服务器公钥进行协商密钥。但是如果证书在传输过程中被第三方获取,把服务器公钥改成自己的公钥,依然可以伪装成真实服务器与客户端通信。所以需要一种方法能够保证证书不被篡改和伪造。
数字签名
数字签名是依据非对称密钥算法实现的,并且定义了两种互补的运算 —— 签名和验证。签名是对要发送的消息使用私钥加密,验证是使用公钥对加密后的消息解密,如和原消息一致则验证成功。但通常会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得签名的效率大大提高。 由此,CA机构在颁发证书时会把使用CA机构私钥加密的数字签名一同发送到服务器,客户端在拿到服务器证书后,通过操作系统或浏览器内置信任的CA机构找到对应机构的公钥对数字签名进行解密,再用证书中指明的签名算法计算数字证书的签名,最后比较两个值是否一致,一致则表示证书没有被篡改。CA证书的相关信息和具体流程如下:
HTTPS
HTTPS可以被看作是基于TLS/SSL的HTTP协议。TLS/SSL协议的整体设计可分为两层,即握手层和加密层。握手层位于加密层之上,为加密层提供所需要的信息(密钥块)。对于一个HTTPS请求来说,在没有完成握手之前,消息不会传递给加密层,而一旦握手完毕,之后所有的应用层HTTP消息都将经由加密层加密。
-
握手层
在握手层,客户端和服务器交换一些信息,如协议版本号、随机数、密码套件等,经过协商后,由服务器确定此次连接使用的密码套件,该密码套件须双方任何。客户端通过证书确认服务器身份后,双方便可开始密钥协商,并最终协商出预备主密钥、主密钥、密钥块。密钥块后续则由加密层使用。整个协商过程需要经过多个来回才能握手成功,这也是TLS/SSL协议缓慢的原因。
-
加密层
加密层就是使用握手层中双方协商好的密钥块进行对称加密。
HTTPS的通信过程
第一步:客户端发起的第一次握手,此次握手过程的主要目的是从服务端获取数字签名证书,服务端在发送数字签名证书之前要先确认客户端的SSL版本、加密算法等信息。
第二步:完成第一次握手后,接着进行第二次握手。第二次握手是在客户端收到证书后发起的,主要目的是将对称加密使用的密钥发送给服务端。当然这个密钥是使用第一次握手获取的服务器公钥进行加密的。服务端收到这个加密过的密钥后使用自己的私钥进行解密。这样客户端和服务端经过二次握手后都持有了对称加密密钥。
第三步:用对称密钥对HTTP报文进行加解密。
第四步:通信完成后,断开连接。