# App 数据安全篇 > 之前的研究了 web 站点的数据安全,同时也用[文章](https://github.com/FantasticLBP/Anti-WebSpider)记录下来分享给大家。接着又研究了下 App 的安全,同样写文章记录下来 ## 现状 目前 App 的安全比较低,体现在哪?很多人在想用了 HTTPS 不是就很安全吗?其实并不是,专业的抓包工具还是可以抓 HTTPS 包。根据接口规律,做自动化请求接口,将数据保存窃取是我们不想看到的结果。所以如果只用了 HTTPS 还是不安全。 所以需要实现的安全表现在:1. App 数据防止抓包;2. 防止中间人攻击;3. 下下策。即使抓包成功拿到的数据也是密文。如果想解密,是不可逆的。 ## 解决方案 1. App 数据防止抓包 原理:抓包工具工作原理见[文章](https://github.com/FantasticLBP/knowledge-kit/blob/master/第四部分%20开发杂谈/4.10.md) ![App-Server](https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/App-Server.png) **验证证书的真伪**其实一般来说这个过程应该是安全的,因为一般的证书都是由操作系统来管理。所以只要操作系统没有证书链验证等方面的 bug 是没有什么问题的,但是为了抓包其实我们是在操作系统中导入了中间人的 CA,这样中间人下发的公钥证书就可以被认为是合法的,可以通过验证的(中间人既承担了颁发证书,又承担了验证证书,通过验证)。 措施: 客户端为了解决这个问题,最好的方式其实就是内嵌证书,比对一下这个证书到底是不是自己真正的“服务端”发来的,而不是中间被替换了。 - 跟服务端人员拿到 https 证书,导入 Xcode 工程项目中 - AFNetworking设置以下代码 ```objective-c AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate]; manager.securityPolicy = policy; ``` AF的安全策略会自动的在bundle里面查找公钥证书,建立https的时候进行比对。不一样直接就失败了。 AFNetworking 的 AFSSLPinningMode 的三个级别   AFSSLPinningModeNone: (默认级别),客户端无条件信任任何下发的公钥证书   AFSSLPinningModePublicKey: 客户端本地去验证服务端下发的公钥证书的 public keys部分。如果正确才通过   AFSSLPinningModeCertificate: 客户端本地去验证服务端下发的公钥证书的所有部分。如果正确才通过 这样做了之后,就可以即使手机上安装了抓包工具的CA,抓包工具也不能抓到包了。因为你的客户端在验证“服务端”下发的公钥证书的真伪的时候就不会通过“中间人”下发的公钥证书,也就不会建立起来https的连接了。 2. 防止中间人攻击 即使我们的 App 被大神逆向了(iOS + 网络精通),抓到网络请求,然后原封不动去向服务器发起请求,但是服务端做了防重放,也是很安全的。所以防重放机制是 Server 端的安全措施 [防重放](https://www.cnblogs.com/yjf512/p/6590890.html) 3. 密文,反向解密不可逆 采用 RSA 非对称加密算法。 - iOS 端和 Server 端各生成自己的公钥和私钥 使用 **openssl** 生成所需秘钥 - iOS 端生成的公钥和私钥定义为 **iOSPublicKey、iOSPrivateKey**,Server 端生成的公钥私钥定义为**ServerPublicKey、ServerPrivateKey**。将 **iOSPublicKey ** 给 Server 端使用,让它用 **iOSPublicKey ** 加密数据传给 iOS 端,iOS 端用 **iOSPrivateKey** 解密;Server 端将 **ServerPublicKey** 给 iOS 端,iOS 端用 **ServerPublicKey** 加密数据后上传给 Server 端,Server 端利用 **ServerPrivateKey** 去解密,这样就实现了数据传输过程中的加密与解密 ## 资料 [RSA算法原理(一)](http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html) [RSA算法原理(二)](http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.htmll) [素数](https://zh.wikipedia.org/zh-cn/互質) [防重放](https://www.cnblogs.com/yjf512/p/6590890.html)