AFNetwork 3.0 源码解读(五)AFSecurityPolicy

本文深入解析AFNetwork 3.0中的AFSecurityPolicy,探讨HTTPS连接的安全流程,包括服务器证书验证、非对称加密通信以及数据的对称加密传输,确保客户端与服务器间的数据安全。
摘要由CSDN通过智能技术生成

First
我们需要了解下到底什么是HTTPS请求,和HTTPS的原理是什么。

HTTP是一种超文本传输协议, HTTP协议传输的数据都是未加密的,也就是明文的。所以使用HTTP协议传输隐私数据时非常不安全的。 于是网景公司 在1994年 设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS( Hyper Text Transfer Protocol over Secure Socket Layer )。

HTTPS的工作原理:


上图展示了一个网页完整的HTTPS请求的过程。 http://blog.csdn.net/sean_cd/article/details/6966130
  1. 客户端输入网址https://www.domain..com,连接到server的443端口。
  2. 服务器返回一个证书(包含公钥、和证书信息,如证书的颁发机构,过期时间等),证书由服务器所拥有的私钥非对称加密生成。
  3. 客户端对证书进行验证(首先会验证证书是否有效,比如颁发机构,过期时间等等)。
  4. 如果客户端验证通过,客户端生成一个随机数,在用服务器返回的证书(公钥)进行加密传输。
  5. 因为公钥是通过服务器的私钥生成,所以服务器是可以对客户端的传回的加密数据进行对称解密的。服务器拿到由客户端生成的随机数,对要传递的数据使用随机数加密。
  6. 客户端收到服务器使用随机数加密的数据进行解密。

     不过在app的开发中因为我们的app通常只需要和一个服务器端进行交互,所以不必要每次请求都从服务器那边获取证书(公钥),在开发中app直接将服务器对应生成的证书(公钥)放在沙盒中,HTTPS请求时只要直接和服务器返回的证书(公钥)进行比对。如果验证通过则使用公钥进行加密在传递回服务器。
     这样即使app中的证书(公钥)被截取,中间人使用证书冒充了服务器与客户端进行通信时(通过了验证),但因为从app返回的数据都是通过证书(公钥)加密的。而中间人从app截取的证书时公钥,缺少对应的私钥即使截获了信息也无法解密。能够最大的程度的保护传递的信息安全。

      PS: 从上面的通信过程中,最重要的是存储在服务器的私钥。因为只有私钥生成了在通信过程中传递的证书(公钥),且只有通过私钥才能对公钥加密的信息进行解密,所以在开发过程中保护好私钥的安全。


second

苹果已经封装了HTTPS连接的建立、数据的加密解密功能,我们直接可以访问https网站的,但苹果并没有验证证书是否合法,无法避免中间人攻击。要做到真正安全通讯,需要我们手动去验证服务端返回的证书。 AFNetwork中的AFSecurityPolicy模块主要是用来验证HTTPS请求时证书是否正确。  AFSecurityPolicy封装了证书验证的过程,让用户可以轻易使用,除了去系统信任CA机构列表验证,还支持SSL  Pinning方式的验证。


AFSecurityPolicy组成:

其他
  •   SSLPinningMode 
  •   pinnedCertificates 
  •   allowInvalidCertificates  
  •   validatesDomainName  

@property (readonly, nonatomic, assign) AFSSLPinningMode SSLPinningMode
验证证书的模式:
AFSSLPinningModeNone:  这个模式表示不做SSL pinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的。
AFSSLPinningModeCertificate: 这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端返回的是否一致。
AFSSLPinningModePublicKey: 这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息。
ThinkPHP是一款开源免费的PHP开发框架,而ThinkPHP 3.0是ThinkPHP框架的一个版本。ThinkPHP 3.0源码是指这个版本框架的源代码,通过阅读和理解源码,我们可以深入了解框架的设计思想、工作原理以及具体的实现方式。 ThinkPHP框架的源码以MVC(Model-View-Controller)模式组织,将应用程序分为模型、视图和控制器三个层次。其中,模型层用于处理数据、数据库操作等;视图层负责用户界面的展示;控制器层负责接受用户请求,进行逻辑处理,并将结果返回给用户。 ThinkPHP 3.0源码的核心部分包括路由解析、请求分发、调度机制、缓存管理、数据库操作等。框架通过路由解析来将用户的请求转发给对应的控制器进行处理,同时支持URL重写、多模块或子域名部署等高级路由功能。框架还提供了灵活的请求分发机制,可以对请求进行过滤、日志记录、权限控制等操作。 另外,ThinkPHP 3.0源码还提供了丰富的扩展和插件机制。开发者可以通过自定义的扩展或插件来增加框架的功能或修改特定的行为,从而更好地满足自己的需求。这种可扩展性使得ThinkPHP成为一个非常灵活的框架,适用于各种规模和类型的项目。 总之,通过深入研究ThinkPHP 3.0源码,我们可以更好地理解框架的工作原理和设计思想,从而能够更高效地使用和开发基于ThinkPHP的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FY_Chao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值