HTTPS学习总结拿走不谢
副标题[/!--empirenews.page--]
写在前面 最近在看了解HTTP相关的一些知识,主要在看《图解HTTP》这本书,感觉还不错。所以结合自己的理解,做一下笔记。话说之前还大概过了下《HTTP权威指南》,感觉这本书内容过多了,不太适合新手看。新手还是建议看《图解HTTP》。 什么是HTTPS HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。 HTTPS在应用层(HTTP)和传输层(TCP)之间加入了一个安全层(SSL或TLS)。目的是为了解决HTTP协议的几个缺点:
HTTP的几个缺点 通信使用明文(不加密),内容可能会被窃听。 HTTP协议并没有对通信以及数据进行加密,是明文发送的。而我们使用HTTP请求的时候,数据会经过许多个路由器,代理之类的设备,在这个过程中,只要有人在某一个环节抓取了数据包(这个操作并不难),那这个请求的数据就会被看到。如果请求里面有一些重要的数据,比如银行卡账号、手机号、密码等信息,就会有泄露的风险。 无法证明报文的完整性,所以有可能早已篡改。 由于HTTP协议无法证明通信的报文完整性,因此,在请求或响应送出之后直到对方接收之前的这段时间内,即使请求或响应遭到篡改,也没有办法获悉。 换句话说,没有任何办法确认,发出的请求/响应和接收到的请求/响应是相同的。 不验证通信方的身份,因此有可能遭遇伪装。 HTTP协议的实现本身非常简单,不论是谁发过来的请求都会返回响应,因此不确认通信方,会存在以下隐患:
即使是无意义的请求也会照单全收。无法阻止海量请求下的DoS攻击。 HTTP+加密+完整性保护+认证=HTTPS 我们来看下HTTPS是如何解决上面的问题的。 使用通信加密解决HTTP的明文发送问题 不同于HTTP的明文通信,HTTPS的通信是经过加密的。所以,就算有人在通信的过程中抓取到了数据包,因为没有密钥,所以无法知道数据包的具体内容,这样可以对传输的数据进行保护。
HTTPS通信中,客户端和服务器都会有两个相同的通信密钥(设为密钥A),客户端发送请求时,会使用密钥A对请求进行加密成密文,服务器接收到请求之后,会使用密钥A对请求内容进行解密,得到客户端发送的明文,进行处理。响应过程也相似。 因此,在网络传输的过程中,因为数据被加密了,所以就算有人获取到了数据包,因为没有密钥A,所以就无法解密出数据包的内容,看到的是一堆乱码。 像这种加密和解密都是使用同一个密钥的加密方式叫做对称加密(也叫共享加密,共同拥有一个密钥)。使用密钥A加密的内容,只能用密钥A来解密,其他的密钥都无法解密。常用的对称加密算法有DES,3DES,AES。 还有一种加密方式叫非对称加密(也叫公开密钥加密)。非对称加密需要使用两个密钥,公开密钥(public key)和私有密钥(private key)。公开密钥是公开的,所有人都知道。私有密钥是保密的,除了自己,不让任何人知道。
HTTPS不仅仅使用了对称加密的方式,还使用了非对称加密的方式。事实上,HTTPS通信过程中,客户端会持有一个公钥,服务器会持有一个私钥。使用非对称加密可以完成好几个关键的操作。比如验证身份,比如协商通信的对称密钥,比如数据传输过程中加密摘要。
如上图所示,在请求和响应过程中,除了加密后的数据,还会发送一个报文摘要,通过这个摘要,可以验证数据是否被篡改。 拿响应为例,
然后客户端会将自己计算出来的摘要跟服务器发送过来的摘要进行对比,如果两个是相同的,那么证明服务器发出的响应数据跟客户端收到的响应数据是相同的。也就是数据是完整的,没有丢失,也没有遭到篡改。 但是这里的前提是,服务器发过来的摘要没有被篡改,如果有人在篡改了数据之后,连摘要也改了,那就有点坑了。所以HTTTPS会使用非对称加密对摘要进行加密,防止摘要被篡改。
(编辑:淮北站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |