iOS 安全分享

概述:

1. App数据存储的安全: 主要指在磁盘做数据持久化的时候所做的加密

2. App网络传输安全:指对数据从客户端传输到Server中间过程的加密,防止网络世界当中其他节点对数据的窃听、篡改和冒充

3. iOS代码安全:代码混淆、加密或者App加壳,防止逆向应用进行反编译获取应用的关键信息

准备工作:

   1)加密       

     1. base 64加密

     2. MD5 加密、SHA签名加密(hash 算法)(用于验证数据传输的完整性)

     3. 对称加密算法   AES ,DES  

     4. 非对称加密算法   DSA 加密 (一般用于数字签名),RSA(一般在移动设备上使用)

   2)iOS 对于对象的存储使用归档解档

     详见:iOS 中数据的高效归档和解档这篇博客



一 本地存储数据的安全

1) 、数据存储方式

      1. 使用NSUserDefaults 
      2. 写本地文件的方式
      3. 存本地数据库
      4. 使用keychain 进行数据存储

2)、存储的安全分析

     1. NSUserDefaults 

          iOS系统提供的一种保存信息和属性的非常普通的方法,NSUserdefaults 的本质就是把数据存储在本地沙河目录的Library 目录下的Preferences 目录下bundleID. plist命名的文件中,当应用删除时,沙河目录下的数据

       一块跟着删除 ,对于应用中和应用安装相关的数据,可以存储在这里, 对于一般未越狱的程序,该数据是安全的,当越狱之后的手机,则数据就不安全啦

     2. 写本地文件的方式

          iOS 沙河目录包括: tmp , Document ,Library  ,Caches四个目录

         在iOS手机中,系统是基于unix 系统的移植版,系统目录自然也和unix 的系统目录类似,在一般未越狱的手机中,由于系统权限的设置,应用一般只能操作本应用沙河目录下的文件

         未越狱的手机,正常情况下用户是无法访问沙河目录的,但是在开发时在info.plist 文件中设置Application supports iTunes file sharing 设置为YES,用户使用手机连接iTunes 时,是可以访问Document目录下的文件的,

          建议一般数据写文件存储在Library  目录下   

     3. 存本地数据库

          写本地数据库,同样也是存储在沙河目录下,对于已经越狱的手机,当数据库的数据为明文时,是有可能被盗取的 ,对于数据库存储

     4. 使用keychain 进行密码等关键信息的存储

        官方文档地址:https://developer.apple.com/library/content/documentation/Security/Conceptual/keychainServConcepts/01introduction/introduction.html

       优点:  1).  通过开发者证书签名将数据加密后存储在手机系统上本地的FTP服务的 sqlite 数据库,保证数据的安全存储 ,独立于当前的应用

                    2) . 当你删除APP后Keychain存储的数据不会删除,所以在重装App后,Keychain里的数据还能使用

3)、风险的规避方案

        在本地存储的数据,防止被第三方盗取:

     1. 一般不涉及客户隐私和密码的数据,在本地使用NSUserDefaults 进行存储,当牵扯到用户隐私和密码的数据时,建议在存储前使用一定的算法进行加密,在使用时,同样适用相应的算法进行解密
     2.涉及用户隐私和密码的数据建议使用keychain 进行本地的数据存储
     3. 本地避免敏感数据的存储
     4. 在app每一次和服务器进行数据的交互的时候,涉及到敏感数据的时候,客户端和服务器数据通讯时进行RSA+MD5  的加解密,防止第三方的破解

二 网络传输数据的安全

  1). HTTPS 的安全加密

       详见: 阮一峰HTTPS 的系列博客 

   2). 双方数据传输的时候使用对称加密,或者非对称加密+对称加密模仿HTTPS的加密过程 来对数据进行加密

三 iOS 代码安全 

   1). iOS 安全包签名打包的加密


  1. 在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local
  2. 苹果自己有固定的一对公私钥,跟上面 AppStore 例子一样,私钥在苹果后台,公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple
  3. 把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据包含了公钥 L 以及其签名,把这份数据称为证书。
  4. 在苹果后台申请 AppID,配置好设备 ID 列表和 APP 可使用的权限,再加上第③步的证书,组成的数据用私钥 A 签名,把数据和签名一起组成一个 Provisioning Profile 文件,下载到本地 Mac 开发机。
  5. 在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时把第④步得到的 Provisioning Profile 文件打包进 APP 里,文件名为 embedded.mobileprovision,把 APP 安装到手机上。
  6. 在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证 embedded.mobileprovision 的数字签名是否正确,里面的证书签名也会再验一遍。
  7. 确保了 embedded.mobileprovision 里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用公钥 L 验证APP签名,验证设备 ID 是否在 ID 列表上,AppID 是否对应得上,权限开关是否跟 APP 里的 Entitlements 对应等。

   2). 在每一次打包的时候通过脚本代码混淆

   3). 敏感逻辑使用C语言来写


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值