浅谈网络安全之HTTPS
前言
说到Https,对于前端工程师(Android、iOS、H5)来讲都是一个很模糊的概念。
之前,公司为了安全考虑,需要将全网从http
迁移到https
,那时候前端工程师也就只做了一件事:基础域名从http://xx.xx.com
变成了https://xx.xx.com
,非常简单的就完成了迁移,至于https
到底是不是更安全了,大部分人是不清楚的。
于是,我结合了之前的一些经验和近期的总结,对大家做了一次分享,包含以下几部分:
-
网络安全问题
-
HTTP为什么不安全
-
HTTPS为什么安全
-
SSL/TLS
-
实践分析
内容不是很深,但绝对能让你了解HTTPS
为什么安全!
网络安全问题
对于你来说,肯定碰到过浏览的网页中突然多了块广告区域,如下图所示:
领奖图498==iPhone 6s
看着多诱人啊,不明真相的用户还以为是“官方”弄的活动,一旦点击了发生了金钱问题,就会被举报和投诉我们了。作为开发此页面的程序员来说,又得背锅lalala~
排查以后,你发现自己的页面中被注入了不是自己写的广告代码。究其原因就是网页使用的是http协议
,在网络中是明文传输的,在传输过程中会受到各级网络运营商的劫持,又由于是明文传输,很容易就在请求的报文中插入他们的广告代码。如果被非法分子劫持,所有的数据都会是透明的,如果这是一次支付请求呢,细想一下是不是很吓人~
A:这么恐怖😱,有什么办法么?
B:将网络协议从
http
升级为https
即可!A:为什么呢?
B:看下面的分析,你就会明白了。
HTTP为什么不安全
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,位于网络分层的应用层。
HTTP为什么不安全,还得从网络分层开始说,网络分层图(5层)如下:
网络分层从上图来看,原始数据
会经过应用层
->传输层
->网络层
->连接层
->物理层
传输,到达目的地后反向解析物理层
->连接层
->网络层
->传输层
->应用层
拿到原始数据
进行处理。
在实际应用中,我们的网络请求必须通过运营商和ISP到达公网,这就给运营商和ISP机会可以拿到原始数据
,再加上HTTP协议
的明文传输,使其很方便就能将广告代码数据插入到原始数据中,再返回给用户看到了上面的广告。
A:原来是这样子啊,那是不是对数据加密就可以了?
B:聪明,HTTPS就是干加密这事的!
HTTPS为什么安全
HTTPS协议(Hyper Text Transfer Protocol over Secure Socket Layer,超文本传输安全协议),基于SSL/TLS认证的HTTP请求,简单来说就是安全的HTTP请求。
我们先来看HTTP基于TCP建立连接,三次握手建立连接->传输数据->四次挥手断开连接,如下图所示:
Http建立连接过程HTTPS是基于HTTP的,所以建立连接的过程大致相同,额外增加的是加密密钥的获取过程,如下图所示:
HTTPS获取密钥从上图可以简单看出,最终加密是通过对称加密完成的,但是对称加密的密钥是动态生成的,通过非对称加密让客户端和服务端知晓的。
https
相对于http
来说都做了哪些安全保障:
-
CA证书认证,确保访问服务器和客户端的可靠性
-
数据加密传输
A:说了这么多,里面最核心的SSL/TLS是什么?
B:简单来说SSL/TLS就是加密协议,详见下面的分析。
SSL/TLS
简介
-
传输层安全性协议(英语:Transport Layer Security,缩写作 TLS),及其前身安全套接层(Secure Sockets Layer,缩写作 SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。
-
网景公司(Netscape)在1994年推出首版网页浏览器,网景导航者时,推出HTTPS协议,以SSL进行加密,这是SSL的起源。
-
IETF将SSL进行标准化,1999年公布第一版TLS标准文件。随后又公布RFC 5246 (2008年8月)与 RFC 6176 (2011年3月)。
-
SSL/TLS只是一个协议,不仅仅可以用在HTTP上,还可以跟很多常用的应用层协议(比如:FTP、SMTP、POP、Telnet、DNS等)搭配,来强化这些应用层协议的安全性。
-
目前主流使用的是TLS1.2,最新版本是TLS1.3(2018年8月发表)
更多关于SSL/TLS的发展历程,可参考SSL/TLS发展历程
SSL/TLS在网络分层的位置
SSL/TLS所属位置常用的加密算法
-
非对称加密算法:RSA,DSA/DSS
-
对称加密算法:AES,RC4,3DES
-
HASH算法:MD5,SHA1,SHA256
TLS/SSL加密过程
TLS/SSL加密过程TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法,大致流程如下:
-
SSL客户端(也是TCP的客户端)在TCP链接建立之后
-
客户端发出一个ClientHello来发起握手,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息
-
SSL的服务器端会回应一个ServerHello,这里面确定了这次通信所需要的算法,然后发过去自己的证书(里面包含了身份和自己的公钥)
-
Client在收到这个消息后会生成一个秘密消息,用SSL服务器的公钥加密后传过去,SSL服务器端用自己的私钥解密后,会话密钥协商成功,双方可以用同一份会话密钥来通信了
整个加密过程不是一种加密方式完成的,而是多种加密方式组合而成的,简称“密钥套件”,例如
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
协议是TLS。从ECDHE开始,我们可以看到,在握手过程中,密钥将通过短暂的椭圆曲线Diffie Hellman(ECDHE)进行交换。身份验证算法是RSA。AES_128_GCM是一种批量加密算法。最后,SHA-256是散列算法。
上面的流程说明只是简单的阐述了下秘钥的交换过程,至于各种加密算法的使用和选择不在此讨论中。
实践分析
说了这么多理论,下面用一些内容来印证下(下面所有的截图来自于Charles)。
Charles截图思考
浅谈HTTPS就结束了,有一些问题,如果大家感兴趣可以一起交流下:
-
为什么迁移到HTTPS的时候,除了基础域名替换外,不需要做额外的工作?
-
socket是什么,属于网络中的哪一层?
-
HTTPS一定比HTTP慢么?
-
HTTPS就一定安全么?
后记
其实想真正的了解HTTPS,需要深入理解TLS中使用的那些算法,后续会继续研究的,加个todos!