扯一扯HTTPS单向认证、双向认证、抓包原理、反抓包策略
HTTP(HyperText Transfer Protocol,超文本传输协议)被用于在Web浏览器和网站服务器之间传递信息,在TCP/IP中处于应用层。这里提一下TCP/IP的分层共分为四层:应用层、传输层、网络层、数据链路层; 分层的目的是:分层能够解耦,动态替换层内协议
各个层包含的内容:
应用层:向客户提供应用服务时的通讯活动(ftp,dns,http)
传输层:网络连接中两台计算机的数据传输(tcp、udp)
网络层:解决网络上流动的数据包,通过怎么的传输路径把数据包传送给对方(ip)
数据链路层:与硬件相关的网卡、设施驱动等等
然而HTTP也有以下显著缺点:
- 通信使用明文,内容可能被窃听
- 不验证通信方的身份,因而有可能遭遇假装
- 无法证实报文的完整性,所以有可能遭到篡改
这样,HTTPS就登场了。HTTPS中的S表示SSL或者者TLS,就是在原HTTP的基础上加上一层用于数据加密、解密、身份认证的安全层,即
- HTTP + 加密 + 认证 + 完整性保护 = HTTPS
加密相关的预备知识:对称加密和非对称加密。
- 对称加密 : 加密和解密数据使用同一个密钥。这种加密方式的特点是速度很快,常见对称加密的算法有 AES;
- 非对称加密: 加密和解密使用不同的密钥,这两个密钥形成有且仅有唯一的配对,叫公钥和私钥。数据用公钥加密后必需用私钥解密,数据用私钥加密后必需用公钥解密。一般来说私钥自己保留好,把公钥公开给别人(一般公钥不会单独出现,而是会写进证书中),让别人拿自己的公钥加密数据后发给自己,这样只有自己才能解密。 这种加密方式的特点是速度慢,CPU 开销大,常见非对称加密算法有 RSA。
CA证书的相关知识: CA证书是由CA(Certification Authority)机构发布的数字证书。其内容包含:电子签证机关的信息、公钥客户信息、公钥、签名和有效期。这里的公钥服务端的公钥,这里的签名是指:用hash散列函数计算公开的明文信息的信息摘要,而后采用CA的私钥对信息摘要进行加密,加密完的密文就是签名。 即:证书 = 公钥 + 签名 +申请者和颁发者的信息。 用户端中由于在操作系统中就预置了CA的公钥,所以支持解密签名(由于签名使用CA的私钥加密的)
有了这些预备知识后,即可以来看看HTTPS是如何怎样做到安全认证的。
HTTPS单向认证
先来看看单向认证的过程:
image.png
从上图可以看出,服务端拥有一对非对称密钥:B_公钥和B_私钥。详细过程如下:
(1)用户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。
(2)服务端去CA机构申请来一份CA证书,在前面提过,证书里面有服务端公钥和签名。将CA证书发送给用户端
(3)用户端读取CA证书的明文信息,采用相同的hash散列函数计算得到信息摘要(hash目的:验证防止内容被修改),而后用操作系统带的CA的公钥去解密签名(由于签名是用CA的私钥加密的),比照证书中的信息摘要。假如一致,则证实证书是可信的,而后取出了服务端公钥
(4)用户端生成一个随机数(密钥F),用刚才等到的服务端B_公钥去加密这个随机数形成密文,发送给服务端。
(5)服务端用自己的B_私钥去解密这个密文,得到了密钥F
(6)服务端和用户端在后续通讯过程中就使用这个密钥F进行通信了。和之前的非对称加密不同,这里开始就是一种对称加密的方式
HTTPS双向认证
双向认证和单向认证原理基本差不多,单向认证用户端需要认证服务端,而在双向认证中添加了服务端对用户端的认证
image.png
双向认证详细过程如下:
(1)用户端发起HTTPS请求,将SSL协议版本的信息发送给服务端。
(2)服务端去CA机构申请来一份CA证书,在前面提过,证书里面有服务端公钥和签名。将CA证书发送给用户端
(3)用户端读取CA证书的明文信息,采用相同的hash散列函数计算得到信息摘要(hash目的:验证防止内容被修改),而后用操作系统带的CA的公钥去解密签名(由于签名是用CA的私钥加密的),比照证书中的信息摘要。假如一致,则证实证书是可信的,而后取出了服务端公钥
(4)用户端发送自己的用户端证书给服务端,证书里面有用户端的公钥:C_公钥
(5)用户端发送支持的对称加密方案给服务端,供其选择
(6)服务端选择完加密方案后,用刚才得到的C_公钥去加密选好的加密方案
(7)用户端用自己的C_私钥去解密选好的加密方案,用户端生成一个随机数(密钥F),用刚才等到的服务端B_公钥去加密这个随机数形成密文,发送给服务端。
(8)服务端和用户端在后续通讯过程中就使用这个密钥F进行通信了。和之前的非对称加密不同,这里开始就是一种对称加密的方式
HTTPS基本思路总结
HTTPS在保证数据安全传输上使用对称加密和非对称加密相结合的方式来进行的,简单来说就是通过一次非对称加密算法进行了最终通信密钥的生成、确认和交换,而后在后续的通信过程中使用最终通信密钥进行对称加密通信。之所以不是全程非对称加密,是由于非对称加密的计算量大,影响通信效率。
抓包原理
HTTPS即便安全,也是能够被抓包的,常见的抓包工具备:Charles、fildder等。
常用的HTTPS抓包方式是作为中间人,对用户端假装成服务端,对服务端假装成用户端。简单来说:
- 截获用户端的HTTPS请求,假装成中间人用户端去向服务端发送HTTPS请求
- 接受服务端返回,用自己的证书假装成中间人服务端向用户端发送数据内容。
具体过程如下图所示:
image.png
反抓包策略
为了防止中间人攻击,可以使用SSL-Pinning的技术来反抓包。 可以发现中间人攻击的要点的伪造了一个假的服务端证书给了用户端,用户端误以为真。处理思路就是,用户端也预置一份服务端的证书,比较一下就知道真假了。
SSL-pinning有两种方式: 证书锁定(Certificate Pinning) 和公钥锁定( Public Key Pinning)。
- 证书锁定 需要在用户端代码内置仅接受指定域名的证书,而不接受操作系统或者浏览器内置的CA根证书对应的任何证书,通过这种受权方式,保障了APP与服务端通信的唯一性和安全性,因而用户端与服务端(例如API网关)之间的通信是可以保证绝对安全。但是CA签发证书都存在有效期问题,缺点是在 证书续期后需要将证书重新内置到APP中。
- 公钥锁定 提取证书中的公钥并内置到用户端中,通过与服务器比照公钥值来验证连接的正确性。制作证书密钥时,公钥在证书的续期前后都可以保持不变(即密钥对不变),所以可以避免证书有效期问题,一般推荐这种做法。
突破SSL-Pinning抓包
在逆向界,一山更比一山高。 思路是这样的:内置证书或者者公钥的时候,常常会有比照验证的函数,直接控制这个函数的返回结果让验证通过不就好了吗。 于是就有了一个突破SLL-Pinning的经典操作:采用Xposed+justTrustme板块。 这个方案使用的是JustTrustMe这个Xposed板块,它所做的事情就是将各种已知的的HTTP请求库中用于校验证书的API都进行Hook,使无论能否是可信证书的情况,校验结果返回都为正常状态,从而实现绕过证书检查的效果。
【附】相关架构及资料
加群 Android IOC架构设计领取获取往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起探讨交流处理问题。
image
领取方式:
点赞+加群免费获取 Android IOC架构设计
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 扯一扯HTTPS单向认证、双向认证、抓包原理、反抓包策略