一篇漫画故事带你理解透HTTPS(下)

Java基础

浏览数:38

2020-6-15

AD:资源代下载服务

上下集知识点总结:

前情提要:

蝙蝠纪元,疫情之下。二丫欲访问京东购物,不料弹出安全提示,遂找二毛一探究竟。二毛一顿排查后,开始用通俗易懂的语言深入浅出的向二丫解释 HTTP作用及优缺点、HTTPS的功能作用……

未看过上集的,可进入传送门:

【故事】跟零计算机基础的房东女儿讲了一下午的中间人劫持京东事件后,她感激涕零,决定给我免除房租(上)

二丫挂掉电话后,对二毛邪魅一笑…

开始之前,我们先了解一些前置技术。

前置技术

1 对称加密

定义:一种加密算法,只有一个密钥,这个密钥既可以用来加密数据,又可以用来解密数据。

优点:加解密速度快。

缺点:由于只有一个密钥,应用场景不广泛。

2 非对称加密

定义:也是一种加密算法,有两个密钥,一个称为公钥,另一个称为私钥。其中公钥可以广而告之,私钥需要自己妥善保存。公钥可以加密数据,然后用私钥解密;反过来,私钥也可以加密数据,用公钥来解密。

优点:由于公钥和私钥可以互相加解密,应用场景广泛。

缺点:加解密速度较慢。

3 消息摘要:

定义:通过哈希函数,将任意长度的消息变成固定长度的短消息,且一个固定的内容无论经过多少次哈希得到的结果仍然是固定不变的,称为消息摘要。

应用场景:可将长消息缩短,加密处理起来更快。

4 数字证书:

定义:由CA(一个权威的认证机构)颁发的一种证书,里面含有可以标识你身份的信息,类似于我们的身份证。

注:证书是必须由服务端主动向CA申请的。服务端(假设为网站)提供自己的域名等信息,接着CA会使用它们的私钥对内容进行加密,然后作为数字证书返回给服务端。

应用场景:

身份证明。由于CA是权威的,他们的私钥会严格保存,公钥会广为公开,所以一旦服务端网站出示了数字证书后,我们就可以依据颁发证书的CA,找到对应的公钥,然后解密数字证书得到里面的域名信息,并比对当前访问的域名是否跟得到的域名一致,以此判断真假。

5 数字签名:

定义:只有信息的发送者才能生成的、别人无法伪造的一段字符串。

主要有两个步骤生成:

  1. 首先对要发送的内容进行消息摘要得到短字符串。
  2. 发送者再使用自己的私钥对该短字符串进行加密,就得到了数字签名。(当然也可以对整个信息做数字签名,但是经过消息摘要处理的信息会更少,加密更快。)

应用场景:

  • 完整性保护:只要我们使用发送者的公钥解密数字签名,得到原摘要内容,再跟我们自己进行消息摘要的内容进行对比,就能判断,若一致,则说明信息内容没篡改破坏过。
  • 不可抵赖性:由于发送者的私钥只有发送者自己知道,所以只要信息比对一致,就能证明这信息是该发送方写的。

看到这里,读者可能有点懵,那数字签名跟数字证书有什么不同?

  • 数字签名一般是用户用自己的私钥加密摘要生成的,目的是为了数据完整性保护和不可抵赖性。
  • 数字证书是使用CA的私钥加密你的信息形成的,目的是证明你的身份。

HTTPS的技术实现

上集的例子中,小明给小红传纸条,但是小明的明文通信可能会被第四排同学窃听、篡改、破坏、伪装,而对应的解决方法就是使得通信规则能有这三个功能:加密数据、数据完整性保护、身份验证

那该如何使得通信规则有这三个功能?小明在研究了前置技术的内容后,受到启发,决定这样干:

(这里假设学校有个大队长(即CA)能够为学生信息做公证,即颁发数字证书,小明小红都已经申请了自己的数字证书。数字证书中包含自己的姓名、自己的公钥等信息)

1 在开始传对话内容前,小明就先传纸条请求小红的数字证书,请求时也把自己的数字证书传过去。

2 小红收到信息后,就用大队长的公钥解密得到信息,得知是小明请求与她传纸条,于是她含羞的把自己的数字证书回传了过去。

3 小明得到返回的数字证书后,也用大队长的公钥解密得到信息(信息含有小红姓名和小红公钥),比对姓名信息看是否为小红。如果不是小红,则不通信,如果是,进入下一步。

4 小明随机生成一串字符a,然后拿出小红的公钥,并用该公钥加密这串字符a,返回给小红。

5 小红收到信息就用自己的私钥进行解密,然后取出字符a,随后小红将内容 “同意传纸条” 用字符a作为密钥进行对称加密,得到密文后写入纸条中。另外,小红也对内容 “同意传纸条”进行消息摘要,随后用自己的私钥对摘要的内容进行加密得到数字签名,写入纸条署名处。

6 小明收到信息,用字符a作为密钥进行对称解密,得到内容“同意传纸条”。为了鉴别内容是否被破坏或篡改过,小明使用小红的公钥对署名的字符进行解密,得到消息摘要内容a,另外再将内容“同意传纸条”进行消息摘要得到消息摘要b,最后将摘要内容a和摘要内容b进行比对,如果一致,则说明没有破坏或篡改过。

7 通信继续。。

至此上面几个步骤,就完成了安全的连接和通信:双方都使用字符a作为密钥对内容进行对称加密,另外生成数字签名写在一旁用于校验内容。

身份验证的实现:

此前小明不是怕第四排同学伪装成小红回纸条信息吗?

现在有了数字证书的功能,在一开始准备传对话内容前就可以通过CA公钥解密数字证书,得出信息来辨别对方身份。

万恶的第四排同学(中间人)再也无法伪装女神小红了!

注:HTTPS机制非常重要的一点就是假定CA的私钥是安全的,如果泄露了,HTTPS的安全性机制将土崩瓦解。所以CA一般是大公司或组织,因为它们更有能力保护自己的私钥,因此浏览器信任的CA列表往往是一些知名CA。

数据加密的实现:

此前小明不是怕第四排同学窃听纸条信息吗?

现在因为有了前面的身份验证,也就确保得到了真实对方的公钥,并能利用该公钥加密传输即将用于对称加密对话内容的密钥(例子中的字符a)。只要这个对称密钥被安全传输了,后面进行纸条内容的加密也就被高效的实现了。

万恶的第四排同学(中间人)再也不无法偷看我的纸条小秘密了!

注:这里可能会有同学问,既然双方都知道彼此的公钥后,那为何不直接拿对方的公钥来加密自己要发出的信息?这个确实可以,但是却忽略了高效性,前面已经提到过,非对称加密算法比对称加密算法效率要低,考虑到后续通信的频繁性,所以最好使用对称加密来对通信内容进行加密。

数据完整性保护的实现:

此前小明不是怕第四排同学篡改或破坏纸条信息吗?

现在有了数字签名,可与原有信息进行对比,就可以判断纸条内容有无被更改或破坏了。

万恶的第四排同学(中间人)再也无法更改或破坏我对女神表达的情感了!

HTTPS的建立过程:

弄懂了上面小明传纸条的例子,再来理解访问使用 HTTPS 协议网站的建立过程,简直就是易如反掌!

建立安全的HTTPS通讯,可防止中间人攻击,这需要以下步骤:  

1、服务端配置正确了对应的安全证书   

2、客户端发送请求到服务端   

3、服务端返回公钥和证书到客户端   

4、客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端   

5、服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做密钥对需要发送的数据进行对称加密   

6、客户端在接收到加密后的数据使用密钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户   

7、SSL加密建立。后续数据传输还将用到数字签名技术。。

注:小明传纸条的例子和用户访问网站有点不同:小明小红互相传纸条需要双方互相进行身份验证;而用户访问网站,只是用户验证网站,网站不验证用户。但无论哪种情况,使用的底层技术都是上面几种,只是应用情况不同。

事件后续吃瓜

点击域名左边的感叹号标志,就能查看到该网站提供的证书信息。

可以看到这个数字证书的签发人信息,从电子邮箱可以知道 QQ。后续网传这QQ主人还是个初学计算机的高中生……

不过,“初学者”的猜测显然不符合常理,“凭一己之力搞坏网络”所需要的智商,和“拿自己QQ邮箱签名证书”所对应的智商,显然不在同一个位面上。这不符合常理,事出反常必有妖。

最近,这位号主也发话澄清了。。

晚上,二毛坐在电脑桌前,看着万家灯火,想象着二丫又搞懂了一些计算机知识点后,欣喜若狂、欢呼雀跃的样子,不禁感到欣慰。

他随后在电脑上敲下一行标题:跟零计算机基础的房东女儿讲了一下午的中间人劫持京东事件后,她感激涕零,决定给我免除房租。

哎,程序员的快乐,往往就是那么朴实无华、枯燥且乏味。

往期精彩:

【故事】跟零计算机基础的房东女儿讲了一下午的中间人劫持京东事件后,她感激涕零,决定给我免除房租(上)

    欢迎来到程序员二毛的世界,在这里你将看到特点鲜明的人物、跌宕起伏且有趣的故事情节、通俗易懂的技术。

    关注公众号《程序员二毛》,后台回复 1024 领取变强秘籍。

作者:程序员二毛