HTTPS为什么会出现
由于HTTP是明文传输,在传输的过程中,任何人都可能从中截获、修改或者伪造数据;其次是不会验证通信双方身份的;最后,通信双方是不会验证报文的完整性的。为了解决这些问题HTTPS就诞生了。
什么是HTPPS
HTTPS完善了HTTP协议,弥补了HTTP协议的缺陷。它不是新的协议,只是HTTP的通信接口被SSL或者TLS协议替代了。使用SSL
与TLS
来进行通信加密。可以说HTTPS是身披SSL外壳的HTTP。
HTTPS做了什么?
- 加密: 对传输的数据进行加密,防止被窃听。
- 数据一致性: 用户发送的数据会被完整的传输到服务器上,不会被篡改。
- 身份认证: 确认对方身份。
HTTPS端口号443,HTTPS如何做到安全性的,关键在于S 即SSL/TLS。
什么是SSL/TLS
- HTTP协议使用SSL协议之后,就具有加密、认证、数据准确性的功能。任何应用层的协议(比如SMTP电子邮件协议、TeInet远程登录协议等)都可以使用SSL协议进行加密。而TLS是以SSL为原型的一种协议。
- SSL(安全套接层),属于OSI七层模型中的第5层(会话层)。SSL在1999年被更名为TLS(传输安全层)。直到现在,TLS共出现三个版本: 1.1、1.2、1.3。目前使用最广泛的是1.2.
- TLS用于通信应用程序之间提供保密性、数据完整性。 TLS由记录协议、握手协议、警告协议、变更密码规范协议、扩展协议 等几个子协议组成,综合使用了对称加密、非对称加密、身份认证等许多密码学前沿技术。
对称加密
在了解对称加密前,先了解密码学 的东西:
- 明文 : 一般认为明文是有意义的字符或者比特集,或者是通过某种公开编码就能获得的消息。
- 密文:对明文进行某种加密后就变成了了密文
- 加密:把原始的信息(明文)转换为密文的过程
- 解密:把已经加密的信息恢复为明文的过程。
对称加密:指加密和解密使用同一个密钥的方式。只要保证了密钥的安全性,那么整个通信过程也就具有安全性了。
对称加密的算法:
比如DES
、3DES
、ChaCha20
等。目前常用的AES-128
、AES-192
、AES-256
、ChaCha20
。
总结一下对称加密:
加密方使用密钥将原始数据加密,然后将密钥交给解密方解密。这样如果密钥被盗取,任何人都可以解密。
非对称加密
非对称加密有有个密钥:一个公钥一个私钥,一般公钥用来加密,私钥解密。公钥任何人都可以使用,而私钥只有自己使用,是不会传给任何人的。使用公钥加密的密文,只能使用私钥来解密。
非对称加密解决了对称加密的问题:就算公钥被黑客拿到,但是它没有私钥,也就无法解开密文。
非对称加密的算法:
比如:DH、DSA、RSA、ECC。
混合加密
TLS使用的对称加密与非对称加密 的混合加密方式来实现通信的安全性。
AES的加密(对称加密)比较快,而RSA/ECDHE的加密(非对称加密)的速度比较慢。所以TSL就结合了这两种加密方式。
过程大概是这样的(RSA加密):
- 客户端向服务器发送一个
client_random
随机数和加密方法 - 服务器收到之后,返回一个
server_random
、加密方法、自己的公钥 - 客户端接收,接着生成另一个随机数
pre_random
,使用公钥加密后传给服务器 - 服务器用私钥解密这个被加密后的
pre_random
。
现在浏览器和服务器有三样相同的凭证:client_random、server_random和pre_random。然后两者用相同的加密方法混合这三个随机数,生成最终的对称密钥。
ps: 下面会详细讲解,这里只需知道还是会受到中间人攻击。
尽管这样还是会受到中间人攻击。
中间人攻击
如果黑客采用DNS劫持,将目标地址转换为黑客服务器的地址,然后黑客自己造一份公钥和私钥。所有的请求都发给中间人,中间人再以客户端的请求内容向正规的服务器发请求,这样所有的请求与响应,都会经过中间人。正式因为客户端不会验证公钥是不是来自自己请求的网站。
这就是中间人攻击,所以上面的混合加密方式还不可靠,我们还要验证server发来的公钥
是不是来自自己请求的server。(认证)
摘要算法
在解决上面认证问题 前,先解决数据完整性问题
,如何保证数据的完整性?
在TLS中,实现完整性的手段主要是摘要算法。比如MD5、SHA-1等,TLS推荐使用SHA-2(SHA-224/256/384/512)。
所谓摘要算法,可以理解为:把任意长度的数据压缩为一种固定长度的字符串,就要好像给数据加了把锁。 生成的字符串称为摘要。并且这种加密算法不可逆,即没有任何一种密钥可以解开。
这样就解决了数据完整性问题。下面再来看看解决身份认证问题
。
身份认证
如何证明server的身份,就要给server颁发一个身份证
,谁来颁发? CA机构来颁发
。
全球的CA机构就几家,CA机构可以为server颁发一个数字证书
。
CA机构也有自己的私钥和公钥,不一样的是CA机构使用私钥加密,公钥解密。
- server将的原文,公钥传给CA
- CA使用摘要算法(SHA-2)将原文生成摘要。使用自己私钥加密这个摘要 —— 生成数字签名。并将数字签名、证书持有者、公钥等信息组成数字证书发给server。
- server 将原文和数字证书发给client。
- client拿到证书后,使用内置的对应的CA公钥进行解密,获取摘要,并使用相同的摘要算法(SHA-2)对传来的原文进行加密,生成另外一份摘要,比对两份摘要是否相同,相同则身份验证通过。使用这个公钥加密生成的对称密钥X给server,以后都用这个密钥X来通信.
传统的RSA版本握手过程
意思是非对称加密使用的是RSA
加密算法。其实上面已经说了一遍,只是不一样是:
当服务器传送server_random、加密方法的时候,顺便会带上数字证书(包含了公钥), 接着浏览器接收之后就会开始验证数字证书。如果验证通过,那么后面的过程照常进行,否则拒绝执行。
梳理一下整个过程:
TLS 1.2 握手过程
TLS 1.2的握手过程,这里介绍的是非对称加密算法是ECDHE
。看不传统的RSA版本有何不同。
-
1、客户端发加密请求
传递:一个client_random随机数、所支持TLS版本、所支持的加密套件列表。
-
随机数:用于后面生成对称密钥
-
密码套件列表:什么是加密套件列表?举个例子:
比如:
TLS_ECDHE_WITH_AES_128_GCM_SHA256
意思是:在
TLS
握手过程中,使用ECDHE
算法生成pre_rendom
(后面会讲),使用128位的AES
算法进行对称加密,在对称加密中使用主流的GCM
分组模式,最后使用的摘要算法是SHA256
-
-
2、服务器响应
传递:一个server_random随机数、一个server_params参数、确认TLS版本、确认加密套件列表、自己的证书。 (server_params下面会讲)
-
3、客户端验证证书,生成对称密钥
客户端验证证书,验证通过后,传递
client_params
参数给服务器(这个client_params会被服务端放入公钥加密)。接着客户端通过
ECDHE
算法计算出pre_random(基于client_params和server_params)
再接着,客户端将这三个随机数
client_random、server_random、pre_random
,通过一个伪随机函数计算最终的对称密钥
。 -
4、服务端生成对称密钥
服务端收到客户端的
client_params
参数后,也使用ECDHE
算法通过ECDHE
算法计算出pre_random(基于client_params和server_params)
再将三个随机数
client_random、server_random、pre_random
通过一个伪随机函数计算最终的对称密钥
。
RSA和ECDHE的区别:
- ECDHE,是在主流的TLS1.2中,使用的非对称加密的加解密的算法,没有用到RSA。
- ECDHE还有一个特点:就是客户端发送完收尾消息后,可以提前抢跑,直接发HTTP报文,节省一个RTT,不必等收尾消息到达服务器,然后等服务器返回收尾消息。
TSL 1.3做了哪些改进?
在2018年就推出了 TLS1.3,对于TLS1.2做了一系列的改进,主要分为这几个部分:强化安全、提高性能
强化安全
TLS1.3废除了非常多的加密算法,最后保留了5个加密套件
- TLS_AES_128_GCM_SHA256
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_GCM_SHA256
- TLS_AES_128_GCM_8_SHA256
可以看到,对称加密算法只有:AES和ChaCha20
; 分组模式也只剩:GCM和POLY1305
; 摘要算法只剩:SHA-256和SHA-384
了。
注意: ECDHE
非对称密钥的加密算法彻底取代了RSA
加密算法。原因是:RSA被发现了漏洞,一旦服务器私钥被获取,之前所有的对称密钥都会获取,所有被加密的报文都会被破译。而ECDHE
算法在每一次握手时,生成的是不同的pre_random
,进而每一次握手的对称密钥也不同,即使私钥被破解,也不影响历史消息。这种一次破译不影响历史信息的性质也叫前向安全性。 RSA
不具备前向安全性,而ECDHE
具备,所有在TLS 1.3中RSA被彻底取代。
提升性能
握手改进:
- 在第一次握手时,客户端就会发送:
client_params
参数,服务端不必等对方验证证书后,才拿到client_params
, - 其他大体与TLS1.2都差不多,少一个
RTT
时间,所以TLS1.3握手方式也叫1-RTT握手
。
来张图:
最后在脑海中回想一下主流的加密算法:
- 对称加密算法: AES 、ChaCha20
- 非对称加密算法: ECDHE 、RSA
- 摘要算法: SHA
参考文章: