背景描述
一直对https一知半解,看过不少的文章,看的时候觉得别人说的头头是道,但脱离了别人的文章到自己身上的时候又什么都说不出,所以决定自己尝试写写,看能不能写出点理解。
纠正认知
上图是我参考别人的文章梳理出的知识点,红线标记出来的是我之前的疑惑点,从我上学开始有句话就一直记在我心里:公钥加密,私钥解密。也就是这句话一直造成了我的错误理解:公钥只能用于加密,私钥只能用于解密。基于这个错误的认知去理解https,就造成了我对https的理解困难。
其实公钥与私钥是成对的,成对的意思是:公钥加密私钥才能解密,私钥加密公钥才能解密,并且公钥与私钥都可以加密或者解密,它俩唯一的区别就是:公钥是公开的,私钥是私有的。应用它俩的这种特性的技术场景就是:数据加密、数字签名。
场景验证
目前我们的网络是如下图所示的,在到达我们真正要到达的服务器之间是需要经过很多代理的,无论是正常的一二级网络运营商或者是黑客侵入我们的客户端对网络的劫持,我们的数据都是可能要经过网络代理层的,所以黑客很容易获取到客户端请求以及服务端响应的数据,下面我们从黑客攻击的场景描述https是如何做到信息安全的。
信息泄露
由于客户端很容易介于客服端与服务端之间,所以获取到其之间传输的数据很容易。针对这种情况,https采用的是混合加密的方式,对称加密加密内容,非对称加密加密公钥。
- 浏览器生成一个随机数R,并使用网站公钥对R进行加密
- 浏览器将加密的R,以及以R为秘钥使用对称加密加密内容传送给服务器
- 服务器用自己的私钥解密得到R,以R为秘钥使用对称加密解密内容,获取浏览器请求内容
- 服务器处理完请求之后,将响应内容以R为秘钥使用对称加密加密内容,返回给浏览器
- 浏览器以R为秘钥使用对称加密解密内容,获得服务器响应
由于黑客并没有服务器的私钥,所以获取不到R,获取不到R就解析不了数据的明文,并且对称加密的R是请求发生时随机生成的,也保证了黑客不能根据传输的数据,反推出秘钥R。
中间人劫持
解决了信息泄露的问题,我们传输的数据是不能被黑客明文浏览了。但是还存在一种黑客攻击:黑客假装服务器与我们通信,我们的数据根本传输不到服务端,这也是最常见的黑客攻击手段。
前面我们说客户端获取到了服务端的公钥,但是假如客户端获取的这个公钥已经是黑客的公钥了呢?这个黑客就能一直与客户端通信,黑客使用自己的私钥就能获取到了明文内容,而客户端还一直认为自己在和服务端通信。所以针对这种情况,https采用数字签名技术来解决,数字签名采用非对称加密技术与数字摘要技术的应用。存在一种权威的CA认证机构,此机构里存储了服务端提交给它的服务器公钥以及域名等其他信息生成的数字证书,此数字证书经过CA机构的私钥签名(hash+私钥加密)。
所以https请求有一个证书认证的阶段,客户端发送服务器证书的请求,返回CA的证书。然后客户端收到证书后用本地操作系统内置证书上的公钥解密,如果能解开并且验证签名解开的hash内容与证书信息内容的hash一致,就证明证书是合法的,进而证明公钥确实是服务端的公钥。如果黑客返回的是自己的证书,是不能通过验证的,客户端就能发现自己的请求被劫持了。