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