本篇文章为个人笔记,如有错误之处还请指出。
在讲解https之前,需要简单说明一下几个概念。
对称加密:通过一个密钥采用一种算法对数据(信息)进行加密和解密
非对称加密:拥有一组密钥对,称之为公钥和私钥,使用公钥加密可以被私钥解密,同理,私钥加密的数据可以被公钥解密。
回到正题,什么是https,它的全称为hypertext transfer protocol secure 超文本传输安全协议。
https和http有什么不同的地方呢。对于http来说,通信的双方在传输数据时是未加密的,https通过一种加密方式来将数据进行加密安全的传输。
这个时候就需要用到上面的两个概念了。既然https是一种在http基础上将传输的数据加密的协议。那么我们是不是只使用对称加密或者非对称加密就可以了?
先用对称加密来实现一下
使用对称加密:
现在有一个服务器和一个客户端,双方要进行加密的通信。
第一步:双方确定采用对称加密、对称加密的算法。
第二步:双方确定一个对称加密的密钥来进行后续的通信的数据加密
第三步:进行通信
这其中是存在问题的,如果有一个中间人窃取了第二步的对称密钥,那么在服务器--客户端通信的过程中,数据其实是相当于未加密的。
那么我们来使用非对称加密来试一下是否可行呢?
使用非对称加密:
第一步:双方确定非对称加密和算法。
第二步:向对方传递自己的公钥
第三步:各自使用对方的公钥加密信息,对方收到后通过自己的私钥进行解密。
这样看来,和对称加密也是一样的,中间人可以拦截服务器和客户端双方的公钥并将自己的公钥交给服务器和客户端。那么就变成这样
客户端和服务器使用中间人的公钥进行加密,使用自己的私钥解密数据,在中间人这里,可以通过自己的私钥解密数据,并且通过对应的公钥加密数据。这样看来和对称加密没有什么不同。原因在于不管是对称加密还是非对称加密来说,都需要向对方传递一个不是加密的信息(密钥或者公钥)。并且这个信息是可以被修改伪造的。
那让双方都内置密钥,这样是不是就不会被中间人窃取了。但这样的方式是不可取的,因为一台服务器是不可能之和一个客户端进行通信的,总不能每个通信都内置一个密钥吧
在现实中,如果两个人的通信,如何保证信息没有被篡改呢,那就是找公信处进行认证,在网络的世界里也是一样的,有一些权威的认证机构(默认是可信的),可以向他们申请数字证书。来保证数据没有被修改。
注:浏览器会内置一些可信任的证书颁发机构和他们的公钥,如果没有一个可信任的源头,那就没有信任而言。
数字证书:简单来说数字证书分为两面,一面是申请者的公钥和一些基本信息,另一面是对这些信息进行hash处理后再被机构的私钥进行加密的密文(数字签名)
这样我们再来试一试:
客户端请求服务器
服务器返回证书
客户端核验证书,确认证书是由可信任的机构颁发的,并通过证书明文获取到真正的服务器的公钥进行信息的加密。
这里是不是就有了疑问?现在如果客户端使用服务器公钥加密,中间人没法解密,不可以看到数据,但服务器没有客户端的公钥,没法加密数据呀
所以还需要
客户端使用服务器的公钥将客户端自己的公钥加密传输给服务器。
这样双方就拥有的对方真正的公钥了
如果中间人直接将证书进行替换,在客户端浏览器这里没有内置他的证书,就说明他是不可信的。
在这里还要提一点,非对称加密对于对称加密来说,速度效率是非常慢的。
在https中,数字证书、非对称加密、对称加密结合使用来完成数据的加密。