《张三求职日记》基础篇--(4)HTTP和HTTPS

180 阅读7分钟
写在前面:本篇来到了网络协议相关知识,由于这部分知识对于1-3年开发经验的程序员来说往往不会直接用到,都是运用封装好的东西,所以大部分程序员会对这部分知识有所欠缺。但是对这块知识的掌握程度很有可能会影响我们的定级,所以还是应该好好掌握的。有关于张三的背景介绍参考:张三背景介绍

张三又开始了新的面试。

面试官:先来个自我介绍吧。

张三:!@#¥%……&*。

面试官:看你写的支付项目中说请求走的是HTTPS,那你说一下HTTP和HTTPS的区别吧。

张三心想,我一个普通的Java开发,平常也就写写业务代码,这些底层的东西基本都是调封装好的东西,我哪里研究过,只能会啥说啥了。

张三:我对他们了解的不多,要说区别的话就是HTTPS是HTTP加上SSl吧。

看着面试官稍显失望的表情,心中暗自后悔,早知道多准备一下就好了。

面试官:这就没了?(看着张三点了点头,继续问道)那你知道HTTP和HTTPS在哪一层吗?

张三心想,无论是OSI7层模型,还是TCP/IP的5层模型(其实甚至还有4层模型)我都是了解的,回答这个问题当然不在话下。

张三:在应用层。

面试官:你觉得你们用HTTPS比HTTP好在哪呢?

张三:……会更安全吧。

面试官于是换了个知识点来问,后面的省略。

面试官:这次的面试就先到这里,后面会有我们的HR联系你。

张三:好的……

--------------------------------------------------------------------------

张三在这次的面试中出现了什么问题呢?

显然,知识的深度不够,尤其是自己做过的东西用到的知识点都讲不出来,别人又怎敢放心招你进来干活呢?

所以我们就来帮张三补齐缺失的知识点。

HTTP和HTTPS有什么区别呢?我们不看那些抄来抄去的博客,先自己思考一下。

首先,我们打开两个网页,一个是HTTP的,一个是HTTPS的:分别为1.https://www.baidu.com/。 2.http://www.某某某.com/ (我之前公司的官网)




我们发现,浏览器告诉我们了,一个是安全的,一个是不安全的,好了我们得出了第一个结论。

然后我们再仔细看一看截图,安全与不安全之间的区别在于有没有证书。好了既然我们发现了,就来着重看看这个证书是什么:



我们点开浏览器上的证书两个字,哦,它已经告诉了我们证书是干什么的了。


再点开详情看看,着重注意一下出现了一个叫公钥的参数,还提到了RSA(这是个非对称加密算法)。


那我们就来聊聊这个证书是什么以及RSA加密算法是什么,我们不聊那些复杂的握手的过程,各种来回的交互,就只是用能够和面试官讲明白的话说这个东西是什么。

我假设你们都知道了HTTP协议是明文传输,如果不知道的也假装下自己知道,谢谢。

既然HTTP是明文传输,那传输的东西在网络上的任意一个节点(可能是路由器,可能是运营商等等)都是可以被别人截获的,甚至是篡改,这是我们所不能接受的。往轻了说,我们买了什么东西,浏览了什么网页都被别人知道了,个人隐私得不到保证。往重了说,我们的浏览的网页有可能被别人劫持,我们传输的数据安全得不到保证,上网完全处于不安全的的环境下。上面提到张三做的是支付系统,如果采用明文传输究竟会发生多少问题想想都很可怕。

那么既然发现了问题,我们就想要改变。改变的方法是什么呢?那就是在HTTP协议上加一层SSL/TLS。

那这个SSL/TLS该如何保证传输的数据的安全呢?

那当然是加密呀,如果我传输的东西别人都看不懂,那别人岂不是截下来了也没有用吗。但是,我们仔细一想,加密了,其他人是看不懂了,可是该收到数据的人也看不懂啊,他需要能解密,而且他发过来的东西我也要能够看得懂。为了能够实现这个效果,就说明你和我之间要能够有一套你我都能加解密的方法,也就是加解密秘钥。

那么问题来了,秘钥我们之间怎么沟通才能不被别人知道,仅仅我们之间知道呢?

那还能怎么办嘛,再加密呗,不过这次的加密我们不能自己加密,不然如何加密的方法互相还是不知道,再套就子子孙孙无穷尽了。

这时我们就通过证书(CA)的公钥来加密我们的会话秘钥了,客户端把用证书加密的会话秘钥传给服务端,那两边就能安全通信了……吗?

当然不只是如此,公钥既然是公钥,那说明谁都能获取,保证这一套传输的安全的还包括对证书的签名和信息摘要等工作,但是一般问不到这么深,了解到这个程度也够了。

                                                     

那我们就再来说一说RSA算法是什么。

其实我们并不需要知道RSA算法是怎么实现的,底层是怎么加密的,我们只需要知道它是一种非对称加密的算法就行了。那么什么是非对称加密呢?

非对称加密,顾名思义,就是加密和解密的方法不同,具体来说就是加密需要一串秘钥,而解密又需要一串秘钥,加密的秘钥并不能用来解密。

那我们根据这个特性来思考一下,既然加密的秘钥不能用来解密,那我们就可以大胆把这个加密的秘钥传给别人,让别人把用这个秘钥加密好的数据传给我们,我们再用自己的秘钥解密,不就能够实现安全传输了吗。所以在这个情况下用来加密的秘钥叫做公钥,用来解密的秘钥叫做私钥,公钥加密,私钥解密,这个特性请记住。那么我们回头看看HTTPS的证书机制,是不是感觉清晰了许多呢?

既然说到了RSA算法,再回到张三的支付项目中去,在支付项目中,一般是两边都要生成公钥和私钥,而公钥由两边的开发人员偷偷的通过某些方式交换,私钥自己好好保管。而两边的传输内容两边都通过对方提供的公钥做加密,收到内容后通过自己的私钥解密,那么两边就能够实现安全的通信了。当然,如果想要支付系统万无一失,还需要做很多其他努力,但加密是一定要掌握的。

那么HTTP和HTTPS还有什么区别呢?

当然还有一些很明显的区别,比如你们发的请求一个是HTTP开头一个是HTTPS开头啊。还有就是HTTP的端口为80,HTTPS为443。HTTP免费,HTTPS申请证书要钱。HTTPS的资源占用比HTTP要大等等。

那我们了解了这么多知识了,再来回答一下HTTPS比HTTP好在哪吧。

我们完全可以比较专业的回答:
1.HTTPS是更为安全的网络协议。
2.HTTPS因为协议中证书的存在,可以认证用户的服务器,可以确保数据发送到正确的用户那里,并且能够防止数据被劫持,改变。
3.HTTPS协议的网站往往会在搜索引擎里有更高的排名。
4.浏览器上显示的扎眼的“不安全”三个字是我们讨厌的,使用HTTPS可以解决这个问题。

张三这次又学到了许多,我们下周再见。