HTTP劫持
想了解什么是HTTPS,要先知道什么是HTTP
HTTP
HTTP是一个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML文件,图片文件,查询结果等,一般基于B/S架构,即浏览器作为HTTP客户端通过URL向HTTP服务端(WEB服务器)发送所有请求。
我们以访问百度为例:
而实际使用中,绝大说的网站现在都采用的是https协议,这也是未来互联网发展的趋势。
一些网站访问时,可以看到访问的账号密码都是明文传输, 这样客户端发出的请求很容易被不法分子截取利用,因此,HTTP协议不适合传输一些敏感信息,比如:各种账号、密码等信息,使用http协议传输隐私信息非常不安全。
所以,http存在一些问题:
- 请求信息明文传输,容易被窃听截取。
- 数据的完整性未校验,容易被篡改
- 没有验证对方身份,存在冒充危险
HTTPS
为了解决上述的问题,就用到了HTTPS
HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。
- 1.浏览器想服务器发送https请求(包含一套支持的加密规则)
- 2.服务端收到请求之后,生成SSL密钥,包括公钥(服务器)和私钥(服务器)
- 3.返回公钥
- 服务器从浏览器的加密算法规则中选出一组加密算法和HASH算法,并将自己的身份信息(公钥)以证书的形式发送给浏览器,证书里包括网站地址、加密公钥以及证书的颁发机构等;
- 4.客户端验证公钥(服务器)
- 4.1.验证证书的合法性:颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致
- 4.2.若证书受信任,或者用户接受了不信任的证书,浏览器会产生一串随机数的密码(密钥(客户端))),并用证书中提供的公钥(服务器)对其加密
- 4.3.使用约定好的HASH值计算握手消息,并用生成的随机数对消息进行加密,过程如下图:
- 5.客户端将所有信息(握手消息+密钥(客户端))发送给服务器
- 6.服务器端接收信息 用私钥(服务器)将信息解密,得到客户端的密钥,然后用密钥(客户端)解密浏览器发来的握手消息,并验证HASH是否与浏览器发来的一致;对握手消息加密是对称加密,对客户端密钥加密是非对称加密
- 7.服务器端使用使用密钥(客户端)加密一段握手消息,发送给浏览器
- 8.浏览器获取信息后,用密钥(客户端)解密并计算握手消息的HASH,若与服务器发来的HASH一致,此时握手结束,之后所有的听信数据将由之前浏览器生成的随机密码(客户端密钥)利用对称密码算法加密
PS:非对称加密算法用于在握手过程中加密生成的密码,对称加密算法用于对真正传输的数据进行加密,而HASH算法用于验证数据的完整性
那什么是SSL/TLS呢?
SSL(Secure Sockets Layer)安全套接层协议
TLS(Transport Layer Security)传输层安全性协议,TLS是SSL+HTTPS安全传输层协议名称
它们都属于加密协议,在网络数据传输中起到保护隐私和数据的完整性。保证了该网络传输的信息不会被未经授权的元素拦截或修改,从而确保只有合法的发送者和接收者才能完全访问并传输信息。
在应用层和传输层之间使用SSL协议。最广泛的用途在HTTP协议,从而产生HTTPS加密协议。
SSL握手
SSL协议使用非对称和对称加密
SSL/TSL协议保证信息的完整性:
SSL/TLS协议不仅提供信息的机密性,还保证其完整性。为此,它使用消息认证码(MAC,消息认证码)。该认证码使用具有密码密钥的散列函数来计算,该密钥仅通信的发送者和接收者(客户端和服务器)知道。以这种方式,如果修改了所有信息的单个比特,则MAC将完全不同,并且双方当时可以知道信息已被修改。
HTTP劫持
常见的http劫持有DNS劫持和内容劫持
DNS劫持
举例:
在浏览器输入如下域名https:// www.zhihu.com那浏览器要打开这个网站,首先要解析域名www.zhihu.com,结果这个域名被黑客劫持到他的私人服务器1.2.3.4,结果我的浏览器和他 的私人服务器1.2.3.4建立SSL连接,他的服务器1.2.3.4也和www.zhihu.com建立SSL的连接,我收发的数据都通过他的服务器1.2.3.4中转,也就是黑客的服务器1.2.3.4相当于一个https代理服务器,结果我收发的所有数据,他都能看到。可能这样被劫持吗?
这种攻击就是中间人攻击,跳转1.2.3.4就是DNS劫持,DNS被劫持到一个非源端的IP上
1、中间人截取客户端发送给服务器的请求,然后伪装成客户端与服务器进行通信;将服务器返回给客户端的内容发送给客户端,伪装成服务器与客户端进行通信。
2、通过这样的手段,便可以获取客户端和服务器之间通信的所有内容。
3、使用中间人攻击手段,必须要让客户端信任中间人的证书,如果客户端不信任,则这种攻击手段也无法发挥作用。
下面用SSL握手来分析一下流程:
1、首先如果黑客要跟你的浏览器建立SSL连接,那么他需要有一个CA证书,而通常系统内置根证书都是大型机构的根证书,几乎无法伪造。如果非要做一个只能是自签名证书。
2、浏览器拿着对方的自签名证书和系统证书进行校验,结果一定是如下图所示:
3、如果他要假冒其他机构颁发证书,因为没有颁发机构的秘钥,那么这个证书的指纹一定没办法对上,还是一样会报警。
4、除非用户自己主动导入一个自己信任的证书
所以,最好不要随便安装证书
若出现中间人用HTTPS跟服务器通信,然后用HTTP跟客户端通信
只要利用HSTS(HTTP+Strict+Transport+Security,RFC6797)就可以解决这个问题。通过在HTTP+Header中加入Strict-Transport-Security的声明,告诉浏览器在一定时间内必须通过HTTPS协议访问本域名下的资源。
这种情况下,只要用户曾经在安全网络环境下访问过一次某站,中间人在指定时间内也无法让其回落到HTTP
内容劫持
作为中间人,没有服务器的私钥,是不能解密客户端发送的内容的,若没有客户端自己生成的秘钥,就不能解密客户端发送的内容
PS:
1.CA证书保证了公钥的可靠性。
2.服务端私钥+公钥的非对称加解密保证了客户端生成的随机数传输安全,不会被中间人拦截获取。但是非对称加密对服务端开销大。
3.所以利用随机数的对称加密保证后续通讯的安全性,也可以降低服务器的解密开销。
4.HTTPS只针对传输内容进行加密,保证的是客户端和网站之间的信息就算被拦截也无法破解。如果不是全站HTTPS,仅仅只是在登录页采用HTTPS,那些HTTP连接的页面同样是危险的,从HTTP->HTTPS跳转依然可能被劫持。国内的部分银行就是这样,对安全性的考量还比不上百度,百度早就全站HTTPS了。
如何预防HTTP劫持
因为使用中间人攻击,必须让客户端信任中间人的证书
1、证书校验:针对安全性要求比较高的 app,可采取客户端预埋证书的方式锁死证书,只有当客户端证书和服务端的证书完全一致的情况下才允许通信,如一些银行类的app,但这种方式面临一个问题,证书过期的问题,因证书有一定的有效期,当预埋证书过期了,只有通过强制更新或者要求用户下载证书来解决
2、域名检验
写死在代码中?
问题
1、如何验证CA证书的合法性?或者是颁发机构的合法性?通过HASH值?