朋友们,我是fossi,今天开始进入新的篇章,也是本系列正序的最后一个篇章,我们来看看还有什么问题没有得到解决。
一、一片乌云
纵观TCP/IP四层模型,我们花了很多章节将核心的基础部分全部叨叨完了,只要主机接入互联网,主机上都安装TCP/IP驱动程序,我们就可以顺利将消息从一端的应用程序顺利传达到世界上任意另一端的应用程序上,并且还可以借助客户端浏览器展示花花绿绿的美好世界。
我们仿佛置身于美丽而晴朗的天空下,惬意且得意,尽情地享受阳光的沐浴,可是,一片大大的乌云顷刻间来到了眼前:安全问题。
安全问题是一个领域很大的问题,本系列聚焦的是HTTP协议本身的安全问题。
二、HTTP的弱点
HTTP协议,在设计之初并未考虑安全问题,它的设计初衷是用来进行数据传输和共享。
随着web应用的普及,有一小部分黑客借助HTTP的弱点进行攻击,轻则获取你的喜好或浏览记录,重则盗取银行账号、贩卖你的个人信息。
本系列主要关注中间人攻击,所谓中间人就是在客户端和服务器之间有一双无形黑手,对于客户端和服务器来说,根本不会意识到有中间人的存在,也没有办法进行防御。
那么HTTP到底有什么弱点呢?
(1)第一个弱点是:数据未进行加密,一切信息在互联网上裸奔。
我们知道,从浏览器出发,到最终的服务器,会经过大量中间节点,若数据未加密,可轻松在某个节点上进行截获并结合工具理解其含义。
有的读者朋友可能会问:我是否可以在代码层面使用各种加密算法对内容进行加密和解密呢?即在应用层上对传输的数据本身进行加密。
这个没有从根本上解决此问题,因为即便你可以对传输的数据进行加密,但是不能对HTTP头部进行加密,而HTTP头部信息是否加密也是在安全考虑范围内的。
同时此方案不具备通用性,比如服务器对HTML数据进行加密后发给浏览器,而浏览器本身却不会单独适配你的服务端进行解密后再进行页面渲染。
(2)第二个弱点是:无法验证身份,对端跟你聊天的可能是一只狗。
对于HTTP协议来说,只要传输的信息符合HTTP规范即可,而不会确认双方的身份,也没有确认双方身份的标准。
基于这个一点,很有可能实际访问到的网站并不是官方的真实网站,原因可能是在你的电脑或者中间DNS上被劫持到了骗子的网站上。
这一点相信读者朋友们会感觉后背发凉,当你付款的时候,都无法确认对方是谁,你还敢支付吗?甚至连密码都不敢输入了,因为很有可能你的密码和个人信息也被窃取走。
真是可恶,防不胜防!
(3)第三个弱点是:数据被篡改,我爱你变成我恨你。
鉴于存在中间人攻击,中间人在获取到你的信息后,不仅可以随心所欲看你的隐私,甚至还可以将你发送的信息进行篡改后再发送出去。
但是由于客户端和服务端并没有数据是否篡改的校验机制,服务端无条件信任所有接收到的信息。
好啊,杀人还诛心,这个破网是不能再上了!
三、密码学初探
我的意中人是个盖世英雄,有一天他会踩着七色的云彩来娶我。
意中人的名字叫做HTTPS,理解HTTPS之前必须掌握基本的密码学知识,HTTPS本质上就是对密码学算法的组合。
之所以这片乌云这么大,罪魁祸首就是牵涉到密码学,而密码学关系到数学,这一点要想深入下去,则又是一门学科了;而乌云之所以这么黑,是因为安全无小事,一旦出事就是大问题,这也是密码学这么深奥且重要的原因。
目前流行的密码学算法实现是公开的,是经历了长时间考验的,是由佷多理具备深厚数学知识的数学家们所创造,对于开发者来说,即使不了解其背后原理,也可以容易地上手使用他们。
在使用他们的时候,我们必须持有这样的态度:
世界上不存在一种密码学算法,能解决所有的安全问题,需要具体问题具体分析。
世界上也没有绝对安全的密码学算法,对于算法应用者来说,确保目前使用的密码学算法是安全的就可以了。
所以我们最重要的任务是了解特定的一些密码学算法解决了何种问题、在正确的场景下能正确地使用他们。
四、密码学目标
我们上面提三个HTTP的弱点,而引入密码学就是为了解决问题,我们来看看密码学的目标。
(1)机密性
解决信息裸奔问题,密码学最最最核心的任务当然是负责数据加密,只要外人不知道密钥,即使拿到密文信息也毫无意义。
(2)完整性
解决数据篡改问题,即使是加密数据,如果数据被中间人篡改,则应该可以通过某种策略知晓,保障收到的数据就是发送方发出来的原始数据。
在密码学中,主要使用消息验证码( MAC )算法保证完整性 。
(3)身份验证和不可抵赖性
通信双方必须确保对端就是要通信的对象。在密码学中,一般使用数字签名技术确认身份。
此外,数字签名技术还能避免抵赖,举个例子,A向B借钱了,并写了张借条,当B希望A还钱时,A抵赖说借条不是他写的,理由就是有人冒充他写了这张借条。
接下来我们再来抽丝剥茧,慢慢探索HTTPS是如何解决如上问题的。