经常都在听说 https ,在谷歌浏览器上浏览不是 https 的网站,都会提示网站不安全。那到底什么是 https ,以前大概了解过一点点,但是对它的原理则是很模糊,趁着这次作业的机会,好好看看一下协议的实现方式。
<!--more-->
http
谈 https 之前先说一下 http, http 是位于应用层的网络协议,主要用于网络中数据的传输,但是 http 传输是明文传输,这意味着网络上的任何一个人都可以看到你发送了什么消息,接收了什么消息。如果世界上没有不怀好意的人,那这样确实没有什么问题,然而总是有一些变态,或者是坏蛋,喜欢躲在角落里偷窥别人的生活,以此来达到自己的目的。
加密的方式
为了防止被人偷窥,只能想办法加密传输的数据。从大的方面来说,加密可以分为对称加密和非对称加密两种。
对称加密
对称加密很好理解,依靠一种加密算法,生成一个密钥,你可以用这一个密钥对需要加密的数据进行加密,也可以用这个密钥对数据进行解密。总之一个密钥就能完成所有事了,but 问题不在于加密算法,而在于这个密钥要怎么保存。想一想,有没有在不经意间看到过别人输入密码?人是不可靠的,安全问题不能靠人来保证。
非对称加密
非对称加密跟对称加密差距就大了,非对称加密会生成一个公钥和一个私钥;公钥可以公开出来,任何人都可以看到,并且使用公钥对数据进行加密,但是解密只能用私钥来进行解密(理论上是这样)。这样就只需要保存好私钥就行了,如果需要和别人进行通信,只需要把自己的公钥发送过去,这样就可以了。
选择
单对称加密
上面也有解释过,对称加密是不行的,密钥的保存是个大问题。
单非对称加密
单非对称加密应该是可行的,但是每次传输数据双方都需要进行非对称加密的解密运算。非对称加密从数学上保证了从公钥推导出私钥的难度是相当大的,要实现这样的效果,必然要经过大量的运算(与对称加密相比),这会造成大量性能的损耗。
建立会话
https 建立会话的认证过程也是很难的。
如果没有 CA
在没有 CA 的情况下,客户端和服务端需要建立连接。这时候的流程是怎么样的?
客户端 | 服务端 |
---|---|
request | 生成一个密钥对:k1 为公钥,k2 为私钥, 发送 k1 给客户端 |
用对称加密算法生成一个密钥"k", 使用 k1 来加密 “k”,获得密文“k3”, 发送给服务端 | 服务端用 “k2” 来解密 “k3”,获得 "k", ,然后就可以使用 "k"作为密钥传送数据 |
问题?
上面这样的步骤就已经安全了吗???
看似是没有什么问题,但其实有一个很大的问题:身份认证。
你怎么知道你收到的公钥是网站发送给你的呢?在你和网站中间,如果有一个人把网站发给你的公钥拦截了,然后把自己的公钥发送给你,然后再把你发送的数据发送到网站。如果有想法,还能篡改你发送的数据,burpsuite 这种软件就是依靠这样的原理。比较官方的称呼叫做“中间人攻击”。
解决问题
既然问题是身份认证的问题,那就要想办法解决它。要证实双方的身份,那就需要引入公证人,在 https 中就是证书。一个机构,如果全世界都相信它,那我们也可以选择相信它,也包括机构颁发的证书,因此只要机构足够权威,就可以用来证实网站的身份。
因此网站就不能向之前那样自己生成一个公钥,然后发送出去和客户端进行通信了。网站的管理者需要向 CA 申请一个证书,证书中包括了公钥,私钥以及证书的有效信息,以保证证书的真实性和有效性。因为这些机构是足够权威的,因此操作系统和浏览器默认就安装了这些机构的证书,在进行身份认证的时候,会通过本地的证书进行校验,如果网站的证书是有效的,那就认为此次身份认证成功,可以进行数据传输了。
下面这个图是 TLS 握手的流程。
公众号:没有梦想的阿巧 后台回复 "群聊",一起学习,一起进步
有疑问加站长微信联系(非本文作者)