http协议是如今网络通讯中最经常使用的协议之一,可是因为http协议自己并无考虑网络安全方面的问题,所以不少基于http协议的应用都存在安全隐患。所以,咱们有必要了解这些安全问题及解决方法,以保证咱们的应用安全稳定的运行。本文简单的介绍了网络通讯中存在的常见问题和以及解决这些问题的一些技术,并简介了https协议的工做原理。算法
http协议自己是基于tcp/ip协议的,所以传输的数据极可能会在某个网络节点被他人截获,并且http自己并无考虑通讯时的一些安全问题,所以,在使用http协议进行通讯时会存在不少安全隐患,归纳的来讲,这些安全问题能够分为如下几种:浏览器
为了解决网络通讯中的安全性问题,咱们通常会使用加密算法对传输的数据进行加密。加密算法通常分为对称加密和非对称加密:安全
与非对称加密相比,对称加密最大的优势是执行速度快,秘钥便于管理,可是因为对称加密在加密和解密时使用的是同一个秘钥,所以如何在互联网上安全的分发秘钥是非对称加密最大的问题,虽然使用非对称加密能够对传输的内容进行加密,却没法保证秘钥在传输途中不被截获。服务器
因为非对称加密的公钥是能够公开的,解密时所需的私钥无需再互联网上分发,所以非对称加密相对来讲更加安全。且非对称加密使用的秘钥长度通常较长,破解难度相对较大,但也致使非对称加密的执行速度较慢,不适合对大量数据进行加密。markdown
虽然使用加密技术可以保证解惑者没法直接读取到截获的内容,但却没法解决数据在传输过程当中被篡改的问题。若是数据在传输过程当中被黑客篡改,而后黑客也使用相关的加密技术对被篡改的数据进行加密,那么最终接受者在获取到数据时,依然没法判断拿取的数据是否已经遭到篡改。网络
咱们一般使用信息摘要算法来解决数据的完整性问题。摘要算法采用单向Hash函数将需加密的明文"摘要"成一串固定位数的密文,当原文内容发生改变时,计算获得的摘要信息也会变得不一样。发送者同时将原文和原文的摘要发送给接受者,接受者接收到数据后,再用一样的摘要算法对获取的原文内容进行计算,而后用获得的特征信息和发送来的特征信息进行比较,若是相同,说明数据没有被篡改。 tcp
经常使用的信息摘要算法以下:函数
虽然使用信息摘要能够保证传输数据的完整性,可是若是发送的数据和信息摘要都被黑客截获并修改,那么最终接受者仍然没法辩解获取的数据是否和最初的发送者是否一致。为了解决这个问题,就要使用数字签名技术。网站
使用数字签名技术能够验证数据发送方的身份,本质上也是使用的非对称加密算法:A向B发送数据,A先使用本身的私钥进行加密,获得一串数字签名,而后将本来的数据和数字签名同时发送给B,B拿到发送来的数字签名后,若是想要对数字签名进行解密,就只能使用A的公钥进行解密,若是解密成功,就说明获得的数据确实是A发送的。加密
数字签名一般和信息摘要技术配合使用,通常将计算出的信息摘要在进行数字签名,这样即便数据在发送途中被黑客截获,因为黑客没法获得本来发送者的私钥,也就没法对篡改后的数据进行签名,这样既保证了数据的完整性,也验证了发送者的身份。
使用加密算法、信息摘要和数字签名技术以后,虽然数据的保密性、完整性以及同新方身份的验证都有了必定的保障,可是假如与咱们进行通讯的一方自己就是他人假装的,这样前面使用的加密、信息摘要和数字签名就都没有意义了,为了解决这个问题,就要用到数字证书技术。https之因此更加安全,很大程度上是由于https协议使用了数字证书技术。
简单的来讲,数字证书就如同咱们的身份证通常,当咱们同某我的进行交流的时候,如何肯定对方确实是咱们想要交流的那我的?只须要让对方出示他的身份证便可。而身份证是由政府发放的,政府做为权威机构保证身份证的正确性。所以,在数字证书技术中,也要有一个第三方来充当这个权威机构的角色,这个第三方即数字证书认证机构,简称CA。若是咱们想要在应用中使用https协议,那么咱们首先须要向CA机构申请数字证书,申请流程以下:
当客户端使用https与服务器端进行通讯时,客户端会先下载服务器端部署的数字证书,而后使用CA机构的公钥(CA机构的公钥一般会预先内置在浏览器或操做系统中)对证书的数字签名进行解密,获得数字证书的信息摘要。若是对数字签名解密成功,则说明客户端拿到的数字证书确实是CA机构下发给服务端的证书,这样就能判断出对方确实是咱们想要通讯的对象。而后客户端会使用一样的信息摘要算法计算数字证书的信息摘要,并将计算出的信息摘要同对数字签名解密获得的摘要进行对比,若是相同,说明该证书没有遭到篡改,保证了获取到的服务器端公钥是完整的。
除了向CA机构申请证书意外,咱们其实也能够本身来生成数字证书,经常使用的如使用openSSL来生成证书,可是使用自签名证书时不安全的,由于没有了可信赖的CA机构的担保,客户端即便可以拿到自签名证书,也没法证实这个证书确实是真正的服务器发送的证书,极可能在网络传输过程当中这个证书已经被掉包了。
若是网站的服务端使用的时自签名证书,当咱们浏览网站时,浏览器会提示访问的网站不安全,一般会让用户自行选择是否继续访问。
自签名证书一般只在程序开发调试阶段使用,不建议在生产环境中使用。
https协议并不是一种新的协议,而是在http协议的基础上加入了SSL、TSL等协议,使得网络通讯变得更加安全。
https的通讯流程能够归纳为如下几步:
客户端向服务器发送ClientHello报文以开始SSL通讯,该报文中包含了客户端所用的SSL的版本及加密组件列表
服务器端向客户端发送Server Hello报文,该报文中一样包含了服务器端的SSL版本及加密组件列表
服务器端发送Certificate报文,该报文中包含了服务器端的数字证书,客户端收到数字证书后会验证该证书的真实性
服务器发送Server Hello Done报文,最初的SSL握手结束
客户端发送Client Key Exchange报文,该报文中包含了客户端生成的一种被称为Pre-master secret的随机密码串,用于在以后的http通讯中进行对称加密。而且该报文已经使用第三部中获取的服务器端公钥进行加密,防止了对称加密秘钥被获取。
客户端发送Change Cipher Spec报文,告知服务端以后的通讯会使用第5步中的Pre-master secret密码进行加密
客户端发送Finish报文。
服务端一样发送Change Clipher Spec报文
服务端一样发送Finish报文
客户端和服务器端都发送了Finish报文以后,SSL链接便创建完成了。以后客户端发送普通的http请求,请求的内容会用以前的Pre-master secret进行对称加密
服务器响应客户端的http请求,并返回http响应,一样会使用Pre-master secret进行对称加密。
客户端断开链接,关闭TCP通讯
很明显,https最大的优势就是安全,保证了数据的保密性、完整性,验证了通讯方的身份。可是,因为https加入了SSL等协议,增长了握手次数,使得网络通讯变得更加复杂,相比http,网络负载可能会变慢2-100倍,并且因为在通讯中加入了大量的加密解密过程,增长了cpu的负担,加剧了服务器的压力。所以,是否使用https协议,须要根据实际使用场景和业务需求,进行综合的评判。
参考资料:《图解HTTP》 上野宣 著