计算机网络延申(一) HTTPS
这篇文章,我们将从 HTTP 明文传输开始,一步步讲解 HTTPS 是怎么在 HTTP 的基础上实现加密通信的
1、明文传输(HTTP)
一开始的时候,HTTP 设计的初衷只是解决了通信的问题,所以数据是明文传输的
在这种情况下,一些不怀好意的人很容易在双方不知情的情况下,窃取数据
要保证数据不被窃取,唯一的办法就是给传输的数据加密
这样即使别人窃取到数据,也不知道传输的内容,因为他获得的只是一堆看起来无意义的乱码
2、对称加密
(1)对称加密
通信双方约定一个**,这个**只有通信双方知道,用这个**加密的数据,只有用这个**才能够解密
(2)对称加密的问题
对称加密有一个问题,这个问题出现在通信过程的开始,那就是通信的双方要怎么约定**
假如**是通过网络传输的,那么很可能这个**在一开始就被别人窃取
3、非对称加密
(1)非对称加密
要通信的主机首先产生一对**(一个公钥和一个私钥),其中公钥是大家都知道的,私钥是只有才自己知道的
用公钥加密的数据,只有用对应的私钥才能解密,用私钥加密的数据,只有用对应的公钥才能解密
(2)非对称加密的问题
非对称加密也有一个问题,这个问题和对称加密的问题有点相似,就是公钥怎么安全地交到对方手上
假如也是通过网络传输,那么公钥有可能被替换(中间人攻击)
非对称加密解决了密码被窃取的问题,因为公钥是大家都知道的,不存在被谁窃取的问题
现在的问题在于怎么证明 “你就是你”(Alice 怎么知道和自己通信的是 Bob 而不是 Hacker)
4、数字签名
我们暂且抛开上面的问题不谈,先来讨论一下数字签名技术
数字签名的出现主要是为了解决两个问题,一是验证内容是否被篡改,二是确定内容是谁生成的
它具体是怎么做到的呢?不急,我们先来看一下使用数字签名的两个过程,生成签名和验证签名
-
生成签名
发送方使用哈希算法对数据生成一段摘要,然后用自己的私钥对摘要加密,形成一个数字签名
将数字签名附加在数据的后面,一起发送给接收方
-
验证签名
接收方收到后,重新使用哈希算法对数据生成一段摘要 1,同时使用发送方的公钥解密数字签名得到摘要 2
对比摘要 1 和摘要 2 是否相同,如果相同就说明内容没有被修改
怎么验证内容没有被修改,看完上面的两个过程相信大家也已经知道,那么确定内容是谁生成的又是怎么做到的呢
我们注意到一个细节,对摘要进行加密使用的是发送方的私钥,而私钥是自己才有的,这就是唯一性的证明
由于私钥只有自己知道,也就是说只有自己才能签名,而公钥是大家都知道的,所以大家都能验证签名
实际上,数字签名是常规的非对称加密的逆应用,在数字签名中,使用私钥加密,使用公钥解密
5、数字证书
好,我们重新回到之前的问题,怎么证明 “你就是你”,问题的本质其实是公钥怎么安全分发
这时候数字证书就可以派上用场,数字证书是由权威机构颁发给服务器的身份凭证,其实就相当于我们的身份证
服务器拿着身份证就可以证明 “我就是我,是独一无二的烟火”,并且通过数字证书我们还能安全的分发公钥
下面我们先来看看一个服务器是怎么申请证书的,以及客户端是怎么根据证书得到可信的公钥的
-
服务器申请证书
服务器向权威机构(Certificate Authority,简称 CA)申请一个证书
权威机构把服务器使用的公钥、服务器的信息、权威机构的信息等作为原始数据
权威机构用哈希算法对原始数据计算一个哈希值,然后用自己的私钥加密原始数据,得到数字签名
权威机构把数字签名附加在原始数据后,得到数字证书
权威机构返回数字证书给服务器
-
客户端验证证书
客户端收到服务器的数字证书
客户端得到该数字证书的颁发机构的公钥,并用公钥解密数字签名,得到原始数据的哈希值
客户端用哈希算法对数字证书的原始数据计算一个哈希值
如果两个哈希值相同,说明数字证书没有被修改,这样就可以得到服务器的公钥
针对上面的两个过程,我们来回答几个问题
1、为什么数字证书不能伪造?
因为数字证书包含权威机构的数字签名,数字签名的特点就是只有自己才能签名,但是大家都能验证签名
2、为什么权威机构是可信的?
这个问题真要从密码学的角度的确难讲,但是这个道理就相当于在现实生活中我们为什么要相信银行一样
3、在验证证书时,需要使用到权威机构的公钥,这个公钥是怎么传输的?
又回到这个问题,公钥怎么安全分发,按照以前的思路,就是让另一个权威机构给这个权威机构颁发证书
那这就是一个无限递归,怎么搞呀?要想结束递归,那就要给递归设置初始条件
权威机构是一个树状分层的结构,高层的权威机构会给低层的权威机构颁发证书
某些顶层权威机构的证书会内置在操作系统或浏览器中,默认使用的人自动相信他们
6、对称加密 + 非对称加密 + 数字签名 + 数字证书(HTTPS)
兜兜转转,一路过来,终于到最后一步了
把我们之前讲的对称加密、非对称加密、数字签名、数字证书综合应用起来,就是 HTTPS 所使用的加密技术
最后,我们把这些东西串联起来,讲一下 HTTPS 通信的全过程
-
客户端请求建立加密连接
-
服务器给客户端发送证书
-
客户端查看证书的有效日期,如果证书已经过期,那么提示失效,如果证书没有过期,继续下面步骤
-
客户端查看证书的颁发机构
如果客户端知道这个颁发结构,那么就会用对应的公钥验证证书,得到服务端的公钥
若客户端不知道这个颁发机构,那么就会提示这个证书存在风险,让用户选择是否要相信这个证书
-
如果验证通过,也就意味着客户端已经得到服务端的公钥
那么客户端随机生成一个对称**,并用服务端的公钥加密,发送给服务端
-
服务端收到后,用自己的私钥解密,得到对称**
-
此时,双方都已知道对称** ,之后用它进行加密通信
【 阅读更多计算机网络系列文章,请看 计算机网络复习 】