谈一谈HTTPS的优点-信息加密,完整性校验,身份验证
有没有发现,现在大部分的网站都是用HTTPS协议,当你搜索HTTPS的时候,你看到的大概是这个
HTTPS比HTTP安全,HTTPS是通过加密来保证数据安全
再或者是这个图片
先来看一下HTTP和HTTPS的定义:
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议。它可以使浏览器更加高效,使网络传输减少。
HTTPS超文本传输安全协议(英语:Hypertext Transfer Protocol Secure,常称为HTTP over TLS,HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。
HTTPS=HTTP+SSL/TSL,正是SSL/TSL的使用,使HTTP具有信息加密,完整性校验,身份验证的优势,那这些优势到底什么意思呢?
在了解HTTPS的优点之前,我们先聊一聊一些术语:
对称加密:是指用户拥有一个**key,对明文加密和对密文解密使用的都是这个**,即加解密的过程使用的**相同。
常见的对称加密算法主要有 DES、3DES、AES 等。
非对称加密:是指用户拥有一个私钥sk,并利用这个私钥产生公钥pk。用公钥对明文加密形成密文,用私钥对密文解密恢复出明文。(私钥是只有该用户知道,公钥是大家都知道的。私钥产生公钥的过程是不可逆的,换句话说,只能由私钥计算出公钥,不能由公钥计算出私钥)。
常见的非对称算法主要有 RSA、ECC、Diffie-Hellman、DSA(数字签名用) 等。
数字签名:是非对称加密的逆运用,即用用户私钥加密信息,其他用户用公钥解密密文(验证签名)。因此,只有拥有私有私钥的用户可以生成签名。数字签名可以保证发送者事后不能抵赖对报文的签名。
证书:是对公钥进行数字签名,他是对公要合法性提供证明的技术。
非对称加密算法都是基于数学中的难题问题(比如:椭圆曲线加密的离散对数难题,RSA的大数因数分解难题),**起来需要很大的计算力,因此比较安全。
这样看来,在通信的时候使用非对称加密算法会比较安全一些。但是非对称加密算法加解密的速度较慢,对称**加解密的速度较快。这时候就出现了一种折中的办法,即用非对称加密算法协商对称加密的**,通信时信息使用对称加密算法。TLS就是采用这种折中的办法,选择一个非对称加密算法和对称加密算法构成一个混合加密算法。
但是,加密算法有了可以保证数据的机密性,如何保证数据是完整的呢?
在TSL中,实现数据完整性的方法主要是Hash算法。Hash算法又叫散列算法,原理就是把任意长度的输入,通过hash算法变成固定长度的输出。这个映射的规则就是对应的hash算法,而原始数据映射后的二进制串就是哈希值。
Hash算法会输入根据数据的微小变化会得到完全不同的hash值,相同的数据会得到相同的值。就是由于hash算法的这个特性,验证数据的完整性。
经常使用的MD5和SHA都是历史悠久的Hash算法。
如果有黑客在客户端和服务器中间,对于客户端假冒成服务器发响应,对于服务器假冒成客户端发请求怎么办?这就是典型的中间人攻击。(代理也是这个原理,代理器可以访问你访问不到的页面,并将响应消息发送给你的浏览器。)
面对这种攻击,我们就需要一个确认身份的方法。
数字证书认证机构(Certificate Authority,缩写 CA)是一个权威的认证机构,所有人对他都是无条件信任的。用户要是想获得CA证书,就要将公钥给CA,CA用自己的私钥为用户的公钥加密,生成数字签名。CA的公钥,数字签名和一些附加的信息整合,一起生成证书,返回给用户。总之就是对用户的身份进行一次公证,即身份验证。具体过程参考https://juejin.im/entry/5a9ac15bf265da239e4d8831。
有时候,打开v*n上网会显示不安全。就是因为代理器并没有CA证书。
HTTPS的通信过程就是:
首先,客户端根据服务器的CA证书确认服务器端身份;
然后,客户端产生对称**并用非对称加密的方式给服务端;
最后,两端用对称**对会话过程进行加密。
(前两步是通过TSL握手实现的)
TSL握手具体过程为:
- 客户端向服务端 Say Hello,包含支持的 TSL 协议版本、加密算法、**长度等信息。
- 服务端响应客户端信息发送 Server Hello 报文,报文中包含确定的加密算法、**长度等信息。
- 服务端发送证书给客户端。
- 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的TSL握手协商部分结束。
- 客户端收到证书后,验证证书的有效性。如果证书无效,在浏览器上会提示;如果验证有效,发送 Client Key Exchange报文给服务端,报文中包含被称为 Pre-master secret 的随机码(可以理解成对称**),该随机码通过服务端证书中的公钥进行加密。
- 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会使用 Pre-master secret **加密。
- 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。如果服务器能解密出来,则握手成功。
- 服务端收到 Finished 报文并成功解密后,同样发送 Change Cipher Spec 报文和 Finished 报文给客户端。
- 成功建立安全连接,进行 HTTP 通信,底层通过 SSL 加密。 通信结束,发送报文关闭连接。
TSL的握手过程还是挺复杂的,HTTPS要是每次会话都要建立一次TSL握手,通信效率岂不是会很低?
参考了彻底搞懂HTTPS的加密机制找到了答案
服务器会为每个浏览器(或客户端软件)维护一个session ID,在TSL握手阶段传给浏览器,浏览器生成好**传给服务器后,服务器会把该**存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的**并进行解密加密操作,这样就不必要每次重新制作、传输**了!
最后,我要说一下TLS/SSL协议。这是网上的定义
SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
这样看起来是不是觉得SSL和TSL是两个很像又不一样的协议?然后我在维基百科上查了一下SSL的前生和今世:传输层安全性协议
这两个协议完全就是同一个东西好嘛?不对,准确的来说,TSL是SSL的进化形态。而且,现在SSL已经弃用了,大家以后说道HTTPS的时候,还是尽量说TSL吧。
同样都是超文本传输协议,HTTPS你为何如此优秀?