文章首发在我的个人博客:http://www.brandhuang.com/article/1585818084870
如果喜欢本文希望能点个赞~
当然可以关注我来获取后续文章
也可以关注我个人博客
HTTPS
HTTP 的不足:
- 通信使用明文(不加密),可能会被窃听
- 不验证通信身份,因此可能遭伪装
- 无法证明报文的完整性,可能遭篡改
通信加密
HTTP 和 SSL(Secure Socket Layer,安全套接层) 或 TLS(Transport Layer Security,安全传输协议)组合使用来加密 HTTP。
加密后的内容依然可能被窃听,只是可能让人无法破解报文的实际含义
HTTP 和 SSL 组合使用就被称为HTTPS
。
内容加密
对 HTTP 协议传输的内容进行加密,需要客户端和服务端同时具有加密和解密的能力。与 SSL
或者 TLS
将整个通信线路加密
不同,所以内容任有被篡改的风险。
不验证通信方身份就可能遭遇伪装
在 HTTP
通信时,不存在确认通信方的步骤,任何人都能发起请求,服务器收到请求后,也都会返回一个响应(仅限于发送端的 IP 地址和端口没有被 Web 服务器设为限制访问)
不确认通信方会存在以下隐患:
- 无法确定请求发送至目标的web服务器是否是按真实意图返回响应的服务器,
有可能是已伪装的服务器
。 - 无法确定响应返回的客户端是否是按真实意图接收响应的客户端,
有可能是已伪装的客户端
。 - 无法确定正在通信的对方
是否具备访问权限
。(某些重要信息只想发给特定用户通信的权限) - 无法判断请求来自何方,出自谁手
- 即使无意义的请求也会全部接收,
无法阻止海量请求下的DoS攻击
(Denial of Service,拒绝服务攻击)
SSL 不仅提供加密处理,还使用了一种叫证书
的手段,用于确认通信方
无法证明报文的完整性,可能已遭篡改
HTTP 无法证明通信报文的完整性,换句话说,没有办法确认,发出的请求/响应和接收到请求/响应是相同的
在传输途中遭攻击者拦截并篡改内容的攻击叫中间人攻击
。
常用的防篡改方式:
MD5
和 SHA-1
等散列值校验方法,以及用来确认文件的数字签名
方法。
但以上方式仍无法百分百保证结果正确,因为如果 MD5 、数字签名等本身被改写的话,用户是无法感知的,所以有必要使用 HTTPS
HTTP + 加密 + 认证 + 完整性保护 = HTTPS
HTTPS 协议并非一种新协议
,只是 HTTP
通信接口部分用 SSL
和 TLS
协议替代。
通常 HTTP
直接和 TCP
通信,当使用 SSL
后,则变成先和 SSL
通信,再由 SSL
和 TCP
通信。
SSL
采用的是公开密钥加密
的加密处理方式
-
对称密钥加密
:加密和解密同用一个密钥,也称为共享密钥加密
-
公开密钥加密
:使用一对非对称密钥,一把私有密钥(private key)
,一把公开密钥(public key)
。公开密钥随意发布,通过自己的私有密钥进行解密。
HTTPS采用混合加密机制,即公开密钥和共享密钥混合加密的机制
由于公开密钥加密处理速度比共享密钥加密慢
。
所以要结合两者优势,将多种方式结合起来用于通信:在交换密钥(共享密钥加密的密钥)环节使用「公开密钥加密方式」,之后建立通信交换报文阶段则使用「共享密钥加密」
。
证明公开密钥正确性的证书
由于「公开密钥加密」的方式无法证明公开密钥本身是真正的公开密钥,所以采用数字证书认证机构和其相关机构颁发的公开密钥证书
来解决上述问题
数字证书认证机构业务流程:
- 服务器运营人员向证书机构申请公开密钥
- 证书机构识别身份后,对申请的公开密钥做数字签名
- 证书机构分配这个签名后的公开密钥,并将其放入公钥证书
- 服务器将数字证书认证机构签发的公钥证书发送给客户端
- 接到证书的客户端使用认证机构的公开密钥对公钥证书进行签名验证,若验证通过,则说明:1. 认证服务器的公开密钥是真实有效的数字证书认证机构; 2. 服务器的公开密钥是值得信赖的。
上述的「认证机构的公开密钥」
必须安全的转交给客户端,为了保证安全,通常是浏览器厂商发布版本时,通常会事先内置
常用认证机构的公开密钥。
SSL 速度慢吗?
SSL 速度慢分两种:通信慢
、大量消耗CPU、内存等资源导致处理速度慢
(因为SSL需要加密处理,在客户端和服务器都需要进行)
为什么不一直使用 HTTPS?
既然 HTTPS 那么安全,为什么所有的 web 网站不一直使用 HTTPS?
- 和纯文本通信相比,加密通信会消耗更多 CPU、内存等资源,会导致计算机处理的请求数量减少
- HTTPS 通信,证书是必不可少的,所有的网站都购买证书并不合算
所以通常只有敏感信息进行 HTTPS 通信。
本文先整理这么多吧,反正一次也消化不完。
还也可以关注我公众号「九零后重庆崽儿」。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。