Files
knowledge-kit/Chapter1 - iOS/1.42.md
2020-02-25 17:46:51 +08:00

4.2 KiB
Raw Blame History

App 数据安全篇

之前的研究了 web 站点的数据安全,同时也用文章记录下来分享给大家。接着又研究了下 App 的安全,同样写文章记录下来

现状

目前 App 的安全比较低,体现在哪?很多人在想用了 HTTPS 不是就很安全吗?其实并不是,专业的抓包工具还是可以抓 HTTPS 包。根据接口规律,做自动化请求接口,将数据保存窃取是我们不想看到的结果。所以如果只用了 HTTPS 还是不安全。

所以需要实现的安全表现在1. App 数据防止抓包2. 防止中间人攻击3. 下下策。即使抓包成功拿到的数据也是密文。如果想解密,是不可逆的。

解决方案

  1. App 数据防止抓包

    原理:抓包工具工作原理见文章

    App-Server

    验证证书的真伪其实一般来说这个过程应该是安全的,因为一般的证书都是由操作系统来管理。所以只要操作系统没有证书链验证等方面的 bug 是没有什么问题的,但是为了抓包其实我们是在操作系统中导入了中间人的 CA这样中间人下发的公钥证书就可以被认为是合法的可以通过验证的中间人既承担了颁发证书又承担了验证证书通过验证

    措施: 客户端为了解决这个问题,最好的方式其实就是内嵌证书,比对一下这个证书到底是不是自己真正的“服务端”发来的,而不是中间被替换了。

    • 跟服务端人员拿到 https 证书,导入 Xcode 工程项目中

    • AFNetworking设置以下代码

      AFSecurityPolicy * policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
      manager.securityPolicy = policy;
      

      AF的安全策略会自动的在bundle里面查找公钥证书建立https的时候进行比对。不一样直接就失败了。

      AFNetworking 的 AFSSLPinningMode 的三个级别

        AFSSLPinningModeNone: (默认级别),客户端无条件信任任何下发的公钥证书

        AFSSLPinningModePublicKey: 客户端本地去验证服务端下发的公钥证书的 public keys部分。如果正确才通过

        AFSSLPinningModeCertificate: 客户端本地去验证服务端下发的公钥证书的所有部分。如果正确才通过

      这样做了之后就可以即使手机上安装了抓包工具的CA抓包工具也不能抓到包了。因为你的客户端在验证“服务端”下发的公钥证书的真伪的时候就不会通过“中间人”下发的公钥证书也就不会建立起来https的连接了。

  2. 防止中间人攻击

    即使我们的 App 被大神逆向了iOS + 网络精通),抓到网络请求,然后原封不动去向服务器发起请求,但是服务端做了防重放,也是很安全的。所以防重放机制是 Server 端的安全措施

    防重放

  3. 密文,反向解密不可逆

    采用 RSA 非对称加密算法。

    • iOS 端和 Server 端各生成自己的公钥和私钥

      使用 openssl 生成所需秘钥

    • iOS 端生成的公钥和私钥定义为 iOSPublicKey、iOSPrivateKeyServer 端生成的公钥私钥定义为ServerPublicKey、ServerPrivateKey。将 **iOSPublicKey ** 给 Server 端使用,让它用 **iOSPublicKey ** 加密数据传给 iOS 端iOS 端用 iOSPrivateKey 解密Server 端将 ServerPublicKey 给 iOS 端iOS 端用 ServerPublicKey 加密数据后上传给 Server 端Server 端利用 ServerPrivateKey 去解密,这样就实现了数据传输过程中的加密与解密

    资料

    RSA算法原理

    RSA算法原理

    素数

    防重放