在说https
之前,我们先了解一下http
,以及为什么要使用https
.
http(Hyper Text Transfer Protocol)
超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,它是TCP/IP
的上层协议,同时它也是万维网(万维网不等同于互联网,它只是基于互联网的一个服务)的数据通信的基础.
http
协议是客户端浏览器与其他程序或Web
服务器之间交互的应用层通讯协议.但它也有一个致命的缺点:http
协议是明文传输协议,在传输信息的过程中并没有进行任何加密,通信的双方也没有任何的认证,这是非常不安全的,如果在通信过程中被中间人进行劫持、监听、篡改,会造成个人隐私泄露等严重的安全问题.
举一个现实中的例子来说,假设小李要给小张寄信,如果信件在运输的过程中没有任何安全保护,那么很可能会被邮递员(也就是中间人)窃取其中的内容,甚至于修改内容.
https
就是用于解决这样的安全问题的,它的全称为Hypertext Transfer Protocol Secure
,它在http
的基础上添加了SSL(安全套接字层)
层来保证传输数据的安全问题.
本文作者为: SylvanasSun.转载请务必将下面这段话置于文章开头处(保留超链接).
本文转发自SylvanasSun Blog,原文链接: https://sylvanassun.github.io/2017/08/06/2017-08-06-DigestHttps/
https
提供了端对端的加密,而且不仅对数据进行了加密,还对数据完整性提供了保护.不过在讲解https
的加密方式之前,我们需要先了解一下加密算法.
对称加密
对称加密的基本思想是: 通信双方使用同一个密钥(或者是两个可以简单地互相推算的密钥)来对明文进行加密与解密.
常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6.
对称加密看起来很美好,但是密钥要怎么发送过去呢?如果直接发送过去,被中间人截获了密钥岂不是白费工夫.
非对称加密
非对称加密也叫公开密钥加密,它使用了两个密钥,一个为公钥,一个为私钥,当一个用作于加密的时候,另一个则用作解密.
这两个密钥就算被其他人知道了其中一个也不能凭借它计算出另一个密钥,所以可以公开其中一个密钥(也就是公钥),不公开的密钥为私钥.
如果服务器想发送消息给客户端,只需要用客户端的公钥加密,然后客户端用它自己的私钥进行解密.
常见的非对称加密算法有RSA、DSA、ECDSA、 DH、ECDHE.
我们以DH
算法为例,了解一下非对称加密的魅力.
Alice
要与Bob
进行通信,他们协定了一组可以公开的质数$p=23$,$g=5$.Alice
选择了一个不公开的秘密数$a=6$,并计算$A = {g^a} ; {mod} ; {p} = {5^6} ; {mod} ; {23} = 8$并发送给Bob
.Bob
选择了一个不公开的秘密数$b=15$,并计算$B = {g^b} ; {mod} ; {p} = {5^{15}} ; {mod} ; {23} = 19$并发送给Alice
Alice
计算$S = {B^a} ; {mod} ; {p} = {19^6} ; {mod} ; {23} = 2$Bob
计算$S = {A^b} ; {mod} ; {p} = {8^{15}} ; {mod} ; {23} = 2$Alice
与Bob
得到了同样的值,因此${g^{ab}} ; {mod} ; {p} = {g^{ba}} ; {mod} ; {p}$
对称加密+非对称加密
尽管非对称加密如此奇妙,但它加解密的效率比对称加密要慢多了.那我们就将对称加密与非对称加密结合起来,取其精华,去其槽粕.
方法很简单,其中一方先自己生成一个对称加密密钥,然后通过非对称加密的方式来发送这个密钥,这样双方之后的通信就可以用对称加密这种高效率的算法进行加解密了.
Certificate Authority
对称加密与非对称加密结合使用的方法虽然能够保证了通信过程的安全,但也引发了如下问题:
- 客户端要如何获取到服务器的公钥?
- 如果公钥在发送过程被中间人拦截,然后中间人发送自己的公钥给客户端,客户端该如何确认?
解决方法依是通过一个权威的CA(Certificate Authority)
证书中心,它来负责颁发证书,这个证书包含了如下等内容:
- 证书的发布机构.
- 证书的有效期
- 公钥
- 证书所有人
- 数字签名
数字签名是用来验证数据完整性的,首先将公钥与个人信息用一个Hash
算法生成一个消息摘要,Hash
算法是不可逆的,且只要内容发生变化,那生成的消息摘要将会截然不同.然后CA
再用它的私钥对消息摘要加密,最终形成数字签名.
当客户端接收到证书时,只需要用同样的Hash
算法再次生成一个消息摘要,然后用CA
的公钥对证书进行解密,之后再对比两个消息摘要就能知道数据有没有被篡改过了.
那么CA
的公钥又要从哪里来呢?这似乎陷入了一个鸡生蛋,蛋生鸡的悖论,其实CA
也有证书来证明自己,而且CA
证书的信用体系就像一棵树的结构,上层节点是信用高的CA
同时它也会对底层的CA
做信用背书,操作系统中已经内置了一些根证书,所以相当于你已经自动信任了它们(需要注意误安装一些非法或不安全的证书).
Https的交互过程
- 浏览器对服务器发送了一次请求.
- 服务器发送证书.
- 浏览器读取证书中的所有人,有效期等信息并进行校验.
- 浏览器查找操作系统中内置的已经信任的根证书,并对服务器发来的证书进行验证.
- 如果找不到,浏览器报错,服务器发来的证书是不可信任的.
- 如果找到,浏览器会从操作系统中取出
CA
的公钥,然后对服务器发来的证书中的数字签名进行解密.
- 浏览器使用相同的
Hash
算法计算出消息摘要,然后对数字签名中的消息摘要进行校对.
- 如果结果一致,证书合法.
- 之后浏览器就可以生成对称加密的密钥然后用非对称加密的方式发送给服务器,之后的通信就都是安全的了.
总结
现在国内外的大型网站基本都已经全站启用了Https
,虽然相对于Http
多了许多用于加密的流程,但为了数据的安全这点牺牲是必要的,Https
也将是未来互联网的发展趋势.