/首页
/开源
/关于
阿main面试记之HTTPS篇:没有人比我更懂HTTPS了
发表@2020-04-19 17:56:58
更新@2023-04-27 17:24:18
大家好,我是人见人爱花见花开但是却从不见人从不看花的谢顶道人 --- 老李。 众所周知,阿main最近被「一个神奇的网站」优化调整了一波儿,从家人眼中的「帝都高级白领IT从业人员」摇身变成了老李眼中的「一个潜在的社会不安定因素」。心理上讲他慌乱了几天,他告诉我似乎投递出去的简历都像肉包子打了狗,自己在家放个屁还有点儿味儿呢。不过我看他最近稳了稳神儿,似乎稳住了,其实人一旦冷静下来稳住了,眼中能看到的问题和风险都不叫问题和风险,因为能看到的问题和风险一定会被解决掉,最怕的就是未知的问题和风险。 刀爷给他内推了一把著名搜索公司,他十分开心地面试了一波儿,然后被问到了一坨令人绝望的问题,大概如下: ![](https://ti-node.com/static/upload/PNP/a/img_37.png#width-full) 你们先感受下这些问题换你们能答出来多少。老李今天挑选了其中一个巨经典贼恶心很繁琐的问题:HTTPS是如何保证安全的。 没有人比我更懂HTTPS了 我比任何都更了解对称加解密和非对称加解密 又有谁能比我更清楚协商呢 我比谁都更知道CA了 ... ... ... ... ... ... . HTTPS是数学、密码学与网络通信的集大成者,了解HTTPS整个流程中涉及了众多学科,如果一旦中间某个流程上你陷入细节纠纷那就完了,所以千万不要陷入细节,所以我们尝试先从整个流程上说明白,细节部分都直接黑盒子一把:将军赶路,不追小兔。 再次郑重提醒声明:HTTPS完整流程中涉及到了大量的技术方案名词,HTTPS是众多中技术方案组合起来进行综合运用的结果,而且部分逻辑十分绕弯弯,为了能阐述清楚整个过程,需要先搞明白整个流程,不要陷于其中某个环节或者某个名词的技术细节实现,然后请准备好一张纸画一画流程。 鉴于整个流程说清比较复杂,所以整篇文章我将分为上下两篇文章组成。 在正式开始之前,我先介绍几个名词,请大家直接记住他们存在的意义即可(请开始你的背诵): - 对称加解密:常用算法是AES,过程如下A和B通信,双方都使用同一个密钥(比如123456)对数据进行加解密。A先使用123456对数据“ Hello B ”进行加密,然后传送给B,B再利用123456对收到的数据进行解密就可以得到原文“ Hello B ”。对称加解密的目的是为了保证消息的保密性。 - 非对称加解密:常用算法是RSA,过程如下生成一对公钥和私钥,私钥自己持有藏到裤裆里藏好,公钥可以像小广告一样发给任何人。A持有公钥,B持有私钥,A首先利用公钥对消息“ Hello B ”进行加密然后发送给B,B收到消息后利用藏在裤裆里的私钥进行解密得到“ Hello B ”;那B如果想给A发送消息咋办呢?利用藏在裤裆里的私钥对“ Hello A ”进行加密然后发送给A,A收到消息后利用公钥进行解密得到“ Hello A ”,好像没问题是吧?仔细琢磨下,公钥任何一个人都可以从B那里获取到,这样B用私钥加密的消息岂不是大家都能解密?这下可逗逼了...所以非对称加解密的正确使用方法是「公钥加密私钥解密实现加解密」、「私钥加密公钥解密实现数字签名和数字验签」。非对称加解密的目的一是为了保证消息的保密性,二是为了保证消息来源身份三方确认(数字签名的作用)。 - 密钥协商:一种乍一听起来比较神奇的算法,就是A和B可以在交换部分公开数据的情况下,分别在自己这里算出一个相同的数字。举个一个很简单的例子 --- A和B先沟通下都选择好一个相同的数字100(可以公开),然后A自己再选定一个数字比如3(藏到裤裆里),B也自己心里默默选好一个数字比如9(藏到裤裆里),A将3乘以100得到300(可以公开),B将9乘以100得到900(可以公开),然后AB之间互相交换300和900,截止到目前为止A拥有100,3,900三个数字,而B拥有100,9,300三个数字,看好了!A将3乘以900得到2700,B将9乘以300得到2700,2700可以作为一个密钥进行加解密通信了,而且整个过程中2700没有在网络上进行传播。 - 单向散列:这个应该好理解,其实就是哈希,常见犹如MD5或者SHA1、SHA2、SHA3等。单向散列是为了保证消息的完整性,粗暴说就是保证消息没有被篡改。 - 数字签名:非对称加解密中的RSA就可以实现,一般是为了保证消息来源身份三方确认。就是说这个数字签名就是用来确认发送方身份的。这种技术非常厉害,TA对如下问题作出保证 --- B用私钥进行加密生成数字签名,A用公钥对数字签名逆向解密,如果成功就一定表示该数据来源于B;如果有第三个人C利用自己私钥生成数字签名,然后C劫持了B和A中间的网络,C冒充B将自己的数字签名发送给A,那么A利用B的公钥对数字签名进行解密时候,会报错! - 数字证书:CA们颁发给申请者的,粗暴理解数字证书目的就是「向所有人保证来自于A的公钥真的是来自A的公钥」。数字证书中包含内容有:公钥内容,公钥内容的单向散列值,计算单向散列所用的方法,对钥内容的单向散列值的数字签名,数字证书的颁发日期以及过期时间等等众多内容...其实就是你访问HTTPS网站浏览器里那个玩意,大概长这样: ![](https://ti-node.com/static/upload/PNP/a/img_38.png#width-full) - CA机构:颁发数字证书的机构。文章中有详解。 ### 第一步:光着腚的数据们 众所周知,只有HTTP的时候,我们信息都是在光着屁股满大街跑的欢,此处不要陷入偷窥癖是如何偷窥我们的细节中。 ![](https://ti-node.com/static/upload/PNP/a/img_39.png#width-full) ### 第二步:对称加解密强顶一波儿