目录
1.HTTP协议介绍
HTTP协议,全称超文本传输协议,顾名思义,HTTP协议是用来规范超文本的传输,超文本,也就是网络上的包括文本在内的格式各样的消息,具体来说,主要是规范浏览器和服务端的行为的。
并且HTTP是一个无状态协议,也就是说服务器不维护任何相关客户端过去所发请求的消息,这其实是一种懒政,有状态协议会更加复杂,需要维护状态(历史消息)而且如果客户端或服务器失效,会产生状态的不一致,解决这种不一致的代价更高。
2.HTTP协议通信过程
HTTP是应用层协议,它以TCP(传输层)作为底层协议,默认端口号为80,通信过程主要如下:
1.服务器在80端口等待客户的请求。
2.浏览器发起到服务器的TCP连接(创建套接字Socket)
3.服务器接收来浏览器的TCP连接
4.浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP消息。
5.关闭TCP连接
3.HTTPS的核心--SSL/TLS协议
HTTPS之所以能够到达较高的安全要求,就是结合了SSL/TLS和TCP协议,对通信数据进行加密,解决了HTTP数据透明的问题。
SSL/TLS的工作原理
非对称加密
SSL/TLS的核心要素是非对称加密。非对称加密采用两个密钥,一个公钥,一个私钥。在通信的时候,私钥仅由解密者保存,公钥由任何一个想与解密者通信的发送者(加密者)所知。可以设想这样一个场景,
在某个自助邮局,每个通信信道都是一个邮箱,每一个邮箱所有者都在旁边立了一个牌子,上面挂着一把钥匙:这是我的公钥,发送者请将信件放入我的邮箱,并用公钥锁好。
但是公钥只能加锁,并不能解锁。解锁只能由邮箱的所有者——因为只有他保存着私钥。
这样,通信信息就不会被其他人截获了,这依赖于私钥的保密性。
非对称加密的公钥和私钥需要采取一种复杂的数学机制生成(密码学认为,为了较高的安全性,尽量不要自己创造加密方案)。
对称加密
使用SSL/TLS进行通信的双方需要使用非对称加密方案来通信,但是非对称加密设计了较为复杂的数学算法,在实际通信过程中,计算的代价较高,效率太低,因此,SSL/TLS实际对消息的加密使用的是对称加密。
对称加密:通信双方共享唯一密钥k,加密算法已知,加密方利用密钥k加密,解密方利用密钥k解密,保密性依赖于密钥k的保密性。
对称加密的密钥生成代价比公私钥对的生成代价低的多,那么有人问了,为什么SSL和TLS还需要使用非对称加密呢?因为对称加密的保密性完全依赖于密钥的保密性。在双方通信之前,需要商量一个用于对称加密的密钥 。我们知道网络通信的信道是不安全的,传输报文对任何人是可见的,密钥的交换肯定不能直接在网络信道中传输,因此,使用非对称加密,对对称加密的密钥进行加密,保护该密钥不在网络信道中被窃听。这样,通信双方只需要一次非对称加密,交换对称加密的密钥,在之后的信息通道中,使用绝对安全的密钥,对信息进行对称加密,即可保证传输消息的保密性。
4.对称和非对称加密流程
对称加密
服务器在和多个客户端通信的时候,此时要求每个客户端的密钥都不相同,此时就需要服务器进行生成密钥。在每个客户端与服务器连接的时候,就把密钥生成出来,服务器再把自己生成的密钥通过网络传输给服务器,但是这里有问题,如果黑客将密钥给截获了,这不直接就凉凉了,就类似于下面的内容。
此时黑客就知道了通信的密钥,后续传输的加密数据,黑客就可以轻松的进行解密。
那么再引入一个密钥2使用密钥2对上面的密钥进行加密呢?
此时还得想办法把密钥2也传输给服务器,无论引入多少个密钥,套上几层娃都有泄露的风险。
为了解决上述的问题,引入了非对称加密
非对称加密
首先在引入非对称加密的时候,服务器首先生成一对公钥和私钥,将公钥通过网络传输客户端。
客户端仍然生成对称密钥,使用服务器的公钥,对对称密钥进行加密得到了密钥的密文。
服务器手里持有着私钥,服务器就很容易的能解出对称密钥是啥,于是服务器就得到了原始的对称密钥,就是88888了,接下里就是客户端和服务器就使用这个对称密钥进行加密传输即可。
注:在传输公钥的时候,黑客很有可能拿到公钥,单数需要私钥才能进行解密,私钥服务器手里有。黑客是否可以将服务器黑掉 ,理论上可以,但是实际上可行性不大,成本问题。如果黑客能够直接黑掉服务器的话,就不需要监听客户端和服务器之间的数据了。
既然引入了非对称加密,还要引入对称加密呢?
直接使用非对称加密,来完成所有业务数据的加密传输即可,进行非对称加密和解密运算成本是比较高的,运算成本也是比较低的。对称加密运算成本低,速度快。
中间人攻击
上述过程中看着没什么问题,在传输服务器使用非对称加密的公钥的时候,假如黑客拿到了公钥,并且黑客自己生成了一个公钥和私钥呢?
黑客收到加密的对称密钥之后,因为这个密钥是用pub2进行加密的,自己手上也有pri2,黑客解密之后,拿到了对称密钥并且使用服务器刚才的pub1重新对对称密钥加密,进一步的发送给服务器,重新使用pub1加密,就是为了漫天过海,不要让服务器发现其中端倪。由于刚才黑客已经拿到了对称密钥,之后的数据就是一览无余了。
如何解决上述的中间人攻击呢
之所以能够进行中间人的攻击,关键是在于客户端没有分辨能力,客户端不知道当前这个公钥是不是黑客伪造的,这里的分辨不能靠自证。引入第三方可以被大家信任的公正机构。
颁发证书的时候,公证机构就会针对证书中的各个属性,计算出一个校验和并且针对这个校验和进行加密,就得到了数字签名。针对校验和加密也是非对称加密,公证机构自己生成一对公钥和私钥和服务器的公钥私钥不一样。
公证机构就会自己持有私钥,公钥就会发布各个客户端的设备,往往公钥都是内置系统中的,安装了操作系统就会自带公证机构的公钥。公证机构就会使用自己的私钥对检验和进行加密,得到了数字签名。客户端拿到了证书也就拿到了证书中的公钥,客户端就需要验证这个公钥是否服务器最初的公钥。
此时客户端拿到数字签名,使用系统内置的公钥进行解密,得到了最初的校验和。客户端再重新计算一遍这里检验和进行对比,如果检验和一致,就可以认为证书没有纂改过。
那么黑客替换公钥之后,能否替换掉数字签名,自己算一个呢?
不能的,自己算一个数字签名的话,再使用自己的私钥加密。此时客户端无法使用公证机构的公钥进行解密了,公证机构的公钥是客户端系统自带的,黑客无法替换。
所谓的证书就是服务器各个属性提交给公证机构,证书包含网站的域名,服务器的公钥,证书的过期时间,数字签名,而数字签名就是针对各个属性的计算出来的校验和,还要进行加密操作的。