计算机网络延申(一) 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 通信的全过程
-
客户端请求建立加密连接
-
服务器给客户端发送证书
-
客户端查看证书的有效日期,如果证书已经过期,那么提示失效,如果证书没有过期,继续下面步骤
-
客户端查看证书的颁发机构
如果客户端知道这个颁发结构,那么就会用对应的公钥验证证书,得到服务端的公钥
若客户端不知道这个颁发机构,那么就会提示这个证书存在风险,让用户选择是否要相信这个证书
-
如果验证通过,也就意味着客户端已经得到服务端的公钥
那么客户端随机生成一个对称密钥,并用服务端的公钥加密,发送给服务端
-
服务端收到后,用自己的私钥解密,得到对称密钥
-
此时,双方都已知道对称密钥 ,之后用它进行加密通信
【 阅读更多计算机网络系列文章,请看 计算机网络复习 】