我们在浏览器中通信用的比较多的是 HTTP
和 HTTPS
两种协议,但是用 HTTPS
时浏览器总是会有一个小锁的标志,提醒我们这是安全链接,而 HTTP
它就会提醒我们这是不安全的链接,好家伙,只是差了一个字母你浏览器就要区别对待?
因为 http 不太安全
其实主要是因为 HTTP
是一个明文传输协议,用它传输内容等同于果奔,你能想象到你给别人发的私密信息被陌生人看到后的社死现场吗?
当然作为一个前端,我在浏览器中看到 https
和 http
的数据都是‘明文’,毕竟请求已经到我这里了,那么怎么证明我的信息在用 http
传输的时候实际上是明文呢?你可以用 wireShark
去抓个包啊,抓包之后就可以看到了
那么 HTTPS
为什么是安全的?
先说答案,它是由三种算法加持,外加知名机构背书
对称加密
只是说完上面一行字肯定是不够的,还是得再多拓展一下
既然我们知道 http
是明文传输的,如果别人用 wireShark
之类的抓包工具抓一下包,你的信息可能就泄露了,所以通信的双方的发送的内容是可以被看到的
为了解决这个问题我们可以使用对称加密的方式去加密内容,也就是 AES
算法,而对称加密就是通信双方都用同样的密钥加密解密传输内容,其过程如下
注意一个小细节,我们的加密解密都是通过这个密钥去完成的,所以单独一方加密完了还不行,发送方和接收方都需要有这个密钥,那个密钥不能是一开始就有的,一些的密钥不可能在我买电脑的时候就存好了,比如我需要掘金的密钥,我难道需要到掘金的服务器去问一下密钥吗?
所以肯定是在通信的过程中顺便发送的(比如三次握手以后第一次传输),而密钥发送同样因为抓包之类的操作,存在被中间人拦截的可能,所以密钥的发送也是不安全的,万一这个中间人把我的密钥也拿了,我以后的通信内容不就被他看到了?
所以面对互联网的信息传输使用对称加密不太现实,等同于大声密谋,它适用场景比较适合于通信双方已经提前约定俗成,关于对称加密的更多信息请自行查阅,凯撒密码就是属于对称加密
非对称加密
对称加密不行还可以上非对称加密,对应 RSA
算法,非对称加密的核心机制是公钥私钥机制,简单来说就是,公钥谁都可以看,而私钥只有我自己有,可以用下面的图形象生动的解释
拥有公钥的人可以往我的邮箱里面塞信件,而只有我拥有私钥能够打开我的信箱,拿出里面的邮件阅读
其具体过程如下
这下我发送信息给服务器就不慌了,就算我的舍友拦截我的请求也不知道里面是什么,就算他坏的一批,修改了我的包的内容,服务器大不了看作是垃圾数据吗
但是这个非对称加密还是有三个问题
- 它很慢,如果我要对我的
GET
请求加密,GET
请求的url
长度在Chrome
中被限制为8182
个字符,如果都加密,可能会很久 - ‘我’怎么拿到‘你’的公钥?
- ‘我’怎么知道是‘你’的公钥?
非对称加对称
对于上面的第一个问题,非对称加密慢那我用对称加密,但对称加密需要密钥,传输存在风险,那我就用非对称加密传输对称加密的密钥,如下图
还有另一个问题,‘我’怎么拿到‘你’的公钥?,互联网的两台计算机可能距离千里,拿到公钥还是靠传送,所以是 https TLS
握手阶段传的公钥
在上面的图的过程中,预主密钥是在本地生成的,中间人无法知道,而在传输过程中用公钥加密,中间人没有私钥无法知道,保证了数据私密,但是前面说过密钥的传输是可以被发现的,也是和对称加密有同样的问题,中间人是可以修改我们的公钥的,甚至是伪造成服务器,和下图所示
中间人拦截了请求,用自己的生成的公钥密钥去骗,去偷袭浏览器的信息
数字证书
这一步就是所谓的知名机构背书,让这个知名机构把我的‘公钥’证明是我的公钥,接收方拿到公钥后去知名机构那里比对一下就行了,这个知名机构通常被叫做 CA, Certificate Authority
,它的公钥传送具体流程如下
用 CA
机构的私钥给你的服务器提供的信息(公钥以及服务器相关信息)加密得到数字签名,然后对这个服务器发起 HTTP
请求时,服务器就把这个数字签名加上公钥以及服务器相关信息加上,这个通常被叫做数字证书
简单的说一下,为什么这样传递公钥不会被中间人恶意利用
- 首先,
CA
公钥是已经预先存储好在你的电脑里面的,因此不存在中间人攻击,除非你的电脑是被恶意设计过的 - 数字证书用
hash
算法去给数字证书中的内容去加密,得到摘要,Hash
是单向加密,中间人拿到之后无法解密,只能修改,但是当数字证书到达浏览器后会进行一个数字签名比对的过程,如果发现用CA
公钥解出来的内容和CA
私钥加密过的内容不一致,说明被篡改了,此次连接不可信,注意,小细节,我们hash
后得到的是摘要,说明它足够小,因为我们提供的公钥以及一些相关信息可能很多,而RSA
非对称加密本来就很耗时,如果我们直接比对原文去判断数字证书是否被篡改,是很浪费的,因此要Hash
一下 - 然后中间人截取
HTTPS
,它用它自己生成的公钥私钥替代CA
机构的公钥私钥,是无法被浏览器信任的,用户浏览器会使用本地存储的CA
公钥解密,解不开说明是不可信的,注意:中间人拿到服务器的公钥没有任何意义
注意,通信双方建立可信链接,只需要服务端的公钥便可以
最后补上一张 HTTPS TLS
握手图帮助大家理解
总结
HTTPS
建立请求前,先发数字证书- 身份验证,拿到正确的公钥,是请求的正确的服务器
- 完整性验证,确保公钥没有被篡改
- 非对称加密(
RSA
),拿到服务器公钥后,浏览器用这个公钥加密出对称密钥发送给服务器,服务器用私钥解密,中间人没有私钥获取不到信息 - 通信双方使用对称密钥加密信息传送,速度比
RSA
要快,中间人不知道对称密钥无法解密信息