HTTP存在的风险:
一、窃听风险:通信使用明文(不加密),内容有可能被窃听
-
HTTP协议本身不具备加密功能,故HTTP报文使用明文的方式发送;
-
TCP/IP是可能被窃听的网络,通信内容在所有的通信线路上都有可能遭到窥视;
二、冒充风险:不验证通信方的身份,可能遭遇伪装
HTTP协议中的请求和响应不会对通信方进行确认,任何人都可以发起请求,服务器只要接收到请求,不管对方是谁都会返回一个响应,会有一些隐患:有可能是伪装的Web服务器、伪装的客户端、无法确定正在通信的对方是否具备访问权限、处理无意义的请求(Dos攻击)等。
使用HTTP协议无法确认通信方,但使用SSL/TLS协议可以,SSL/TLS不仅提供加密处理,还使用了一种被称为证书的手段,可用于确认通信方。
证书由值得信任的第三方机构颁发,用于证明服务器和客户端是实际存在的。通过使用证书,来证明通信方就是意料中的服务器,减少了个人信息泄露的危险。客户端持有证书即可完成个人身份的验证。
三、篡改风险:无法证明报文的完整性,报文可能已被篡改
HTTP协议无法证明通信报文的完整性(信息的准确度),在请求或响应送出之后直到对方接收之前的这段时间,即使请求或响应的内容遭到篡改,也无法知道。
在请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击称为中间人攻击(MITM) 。
防止篡改:HTTP协议有确认报文完整性的方法,但并不可靠,其中常用的是MD5(单向函数生成的散列值)、SHA-1等散列值校验的方法。但是用这些方法依然无法完全确保结果正确,因为MD5如果本身也被改写的话,用户依然无法察觉到。
基于以上的问题,产生了HTTPS:即在 HTTP 与 TCP 层之间加入了SSL/TLS协议:
那么HTTPS是如何解决HTTP存在的三个风险呢?
混合加密的方式实现信息的机密性,解决了窃听的风险。
将服务器公钥放入到数字证书(CA)中,解决了冒充的风险。
摘要算法的方式来实现完整性,它能够为数据生成独一无二的「指纹」,指纹用于校验数据的完整性,解决了篡改的风险。
一、混合加密:
HTTPS 采用的是对称加密和非对称加密相结合的方式,在交换密钥环节使用非对称加密方式,之后建立的通信交换报文阶段则使用对称加密的方式。
采用混合加密的原因是:先用非对称加密解决密钥交换问题,然后用对成加密保证运算速度快。【兼顾安全和效率】
-
对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
-
非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢。
二、数字证书:
数字证书认证机构(CA):将服务器公钥放在数字证书(由数字证书认证机构颁发)中,客户端只要验证证书是可信的,那公钥就是可信的。
三、摘要算法:
客户端在发送明文之前会通过摘要算法算出明文的指纹,发送的时候把 指纹 + 明文 一同加密成密文后,发送给服务器,服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出的「指纹」做比较,若「指纹」相同,说明数据是完整的。
HTTPS是如何建立连接的?
在TCP连接三次握手完成后,进行SSL/TLS的握手阶段,涉及四次通信:
-
用户在浏览器发起HTTPS请求(如 https://www.baidu.com),默认使用服务端的443端口进行连接;
-
HTTPS需要使用一套CA数字证书,证书内会附带一个公钥Pub,而与之对应的私钥Private保留在服务端不公开;服务端收到请求,返回配置好的包含公钥Pub的证书给客户端;
-
客户端收到证书,校验合法性,主要包括是否在有效期内、证书的域名与请求的域名是否匹配,上一级证书是否有效(递归判断,直到判断到系统内置或浏览器配置好的根证书),如果不通过,则显示HTTPS警告信息,如果通过则继续;客户端生成一个用于对称加密的随机Key,并用证书内的公钥Pub进行加密,发送给服务端;
-
服务端收到随机Key的密文,使用与公钥Pub配对的私钥Private进行解密,得到客户端真正想发送的随机Key;
- 此时SSL/TLS 的握手阶段结束,后续:
-
服务端使用客户端发送过来的随机Key对要传输的HTTP数据进行对称加密,将密文返回客户端;
-
客户端使用随机Key对称解密密文,得到HTTP数据明文;
-
后续HTTPS请求使用之前交换好的随机Key进行对称加解密。
HTTPS中客户端对公钥证书的验证过程:https://www.jianshu.com/p/c5c178ddcf1c
- HTTPS存在的问题:
当使用SSL时,它的处理速度会变慢。(HTTPS比HTTP通常要慢2-100倍)
原因:1> HTTPS需要做服务器、客户端双方加密及解密处理,因此会消耗CPU和内存等硬件资源;
2> 和HTTP通信相比,SSL通信部分消耗网络资源,且SSL通信部分还要对通信进行处理。
- 为什么不一直使用HTTPS:
①与纯文本通信相比,加密通信会消耗更多的CPU及内存资源,如果每次通信都加密,会消耗相当多的资源。因此只有在包含个人信息等敏感数据时才利用HTTPS加密通信,非敏感信息则使用HTTP通信。
②购买证书也是很大的开销,因此一些个人网站可能会采用HTTP通信方式。
总结一下HTTP与HTTPS的区别:
HTTP 是超文本传输协议,信息是明文传输,存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP 三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。
HTTP 的端口号是 80,HTTPS 的端口号是 443。
HTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。