上一篇博主将来关于应用层http协议的博客,在实际面试中大部分情况是够用的,可能也有百分之十的情况会被问道https。我们对于学习呢也要有全面的认知,对于https我们还是要学习一下它的理论知识。万一哪天,大家去做了红客呢?况且现在的网站几乎都是https协议的。
目录
补充背景知识
http和https的关系
背景知识1:加密方式
对称加密
非对称加密
背景知识2:数字签名
概念
如何校验
秘钥交换协商
仅使用对称秘钥(NO)
仅使用非对称秘钥(NO)
使用两对非对称秘钥(NO)
使用对称秘钥和非对称秘钥(NO)
什么是安全?中间人攻击
CA证书认证&&使用对称秘钥和非对称秘钥
CA证书
如果中间人修改基本信息呢?
如果中间人修改数字签名呢?
如果是"合法的"中间人修改基本信息和数字签名呢?
补充
https = http + TLS/SSL
TLS/SSL:也是一个应用层的一个"软件",是对http进行加密处理的,他就是数据的加密解密层。
我们用图来表示一下他们之间的关系:
我们可以看到,http响应的数据是要经过加密处理,所以我们通常说https = http + TLS/SSL。如果http不经过数据的加密解密层,就相当于直接把数据发送到网络中,这时候数据就是裸奔的,也是非常不安全的,如果我们使用像Fillder这样的工具是可以获取到这些数据的。
秘钥只有一个,用该秘钥就可以进行加密或解密。
我们来举一个简单的场景,比如我们C语言中学习过异或这个语法。
我们写一个简单的代码来验证一下:
非对称加密,有一对秘钥:公钥和私钥
可以用公钥加密,但是只能用私钥解密
或者只能用私钥加密,但是只能用公钥加密
一般而言,公钥是全世界公开的,私钥是自己必须进行私有保存的。
如何防止文本中的内容被篡改?以及识别到被篡改?
假设我们提交一个文本,是把原文本的数据签名和"修改"的文本一起提交:
好了,有了上面的知识补充,接下来我们就讲讲秘钥协商具体是怎么实现的,而且如何保证数据的安全呢?
注意:为了防止给大家造成误解,这里(NO)表示实际过程中我们不采用这种协商手段,但是博主写在这里了,是为了帮助大家理解,甚至必要时,给面试官展示一下自己的深入思考。
对称加密:
双方第一次通信的时候,需要先将秘钥得到秘钥,有两种方法:
1、预装:这种显然是不现实的,这种做法成本太高,我们不采取。
2、协商:双方通信的时候,秘钥协商第一次有加密吗??绝对没有!!
这时候问题就出来了,我们第一次把秘钥X交给对方的时候,是很有可能被其他人获取到的!那么以后双发再次通信,数据都会被别人用X进行解密,这样做是非常不安全的!所以这种方式我们不采取。
所以,由上面可以看出来,单使用非对称秘钥也是不能成功实现秘钥协商的,它只能保证单向的数据安全传送,那我们就可以发现,如果使用两对非对称秘钥不就可以保证数据双向的安全传输了?
从上面的过程来看,好像是保证了数据的安全传输的问题,按照上面的方法就可以了吗?事实并非如此:
1、依旧有被非法窃取的风险。(这个问题我们到后面来说,这里先简单忽略掉)
2、非对称加密算法,是特别费时间!(对称加密算法是比较节省时间的)
所以,为了效率的提高,实际并不采用上面的协商方案。那么我们使用对称秘钥(效率高)和非对称秘钥(安全)结合使用呢?
进一步来看:
在秘钥协商阶段,server以安全的方式拿到了client发来的对称秘钥的私钥信息X。
采用对称秘钥和非对称秘钥的协商手段真的就安全了吗?不是的,我们首先来谈谈什么是安全。
安全不是不让别人拿不到就叫安全,因为在网络通信中,数据是不可能不被别人拿到的。所以说,安全就是,如果别人拿到了,也没法处理,或者破解的成本远远大于得到数据的效益。
说个题外话:一般来说,对于加密级别非常高的数据,传统计算机破解需要几十年、几百甚至上千年,前提是原算法不能做改变。现在我们国家大力发展量子计算机,相比较于传统二进制计算机,它的计算效率是上万倍甚至几十万被的提高,所以难免国外很担心我们在量子计算机的突破发展,事实上他们不是害怕我们量子计算机技术的提高,更重要的是国家信息安全层面上,如果暴力破解,原来几百年才能做到现在只需几秒就可以了。当然,我们并不会这么去做,而是用在有意义的地方。说不定大家将来就是参与量子计算机研究的科学家呢~
中间人攻击:
由上面过程我们可以看出来,中间人拿到了client和server通信的秘钥X,那么中间人随时可以获取他们之间的数据,使用秘钥X进行解密,获得数据,显然,这也是有很大风险的~
本质问题:client无法判断发来的秘钥协商报文是不是从合法的服务端发来的!!!
CA机构是一个具有权威的机构,每一个人可以向他申请合法的CA证书,它有自己的公钥和私钥,私钥只有CA机构知道。
如果加入CA证书为什么就保证安全了呢?
client获取证书的时候,会将基本信息内容通过Hash散列形成数据摘要,数字签名使用公钥解密形成数据摘要,然后比较这两个数据摘要是否一致,一致的话,就接收,否则就不接收。 这个就是我我上面补充的背景知识了。
上面的前提是,client必须知道CA机构的公钥信息,并且只信任CA机构的公钥信息!也只认CA机构的公钥!
没事的,如果仅仅修改基本信息,到后面通过Hash散列形成数据摘要,再到后面比对时,是不匹配的,client不信任此证书。
中间人无法修改匹配的数字签名,因为CA机构才知道私钥,中间人是无法进行加密形成的。
如果中间人把自己申请的CA整数发给客户端,来获取对称秘钥呢可行吗?答案是不行!
别忘了,基本信息里面有个域名,当客户端接收CA证书后,假设当client访问百度网站时,由于域名不同,访问到了qq官网,那么client就立马检测到该整数不合法,立马就舍弃掉。
CA机构并不止一家,但是他们之间的秘钥都是相互可信任的,所以这个不用担心申请哪家的CA证书。
client端的是知道CA机构的公钥信息,这个一般是内置的(我们可以在自己的电脑中查找)。当然也有少数情况我们在访问某浏览器时,会提示我们安装并信任某某CA机构证书。这种情况比较少见,通常这样提示,很有可能我们访问这个网站不安全~
看到这里,给博主点个赞吧~