《高性能iOS应用开发》安全
2018-03-14 本文已影响25人
Yasic
任何附加的安全层都会导致应用变慢,需要权衡。
应用访问
匿名访问
这里涉及到如何为设备创建唯一的标识符。
目前主要有两个,IDFV 和 IDFA。
- IDFV-Identifier For Vendor(应用开发商标识符)
IDFV 是设备上每个应用的唯一持久标识符,其中 Vendor 就是应用开发商,对于 iOS7 以后的新版本,这个值通过 bundleId 除去最后一部分的剩下部分来生成。可以用两种方式来保留唯一的设备 ID,其一是将 bundleId 除最后一部分保持唯一,其二是通过共享钥匙串来共享密钥。IDFV 是一种应用加设备绑定产生的标识符,如果用户将属于此 Vender 的所有 App 卸载,则 IDFV 的值会被重置,再重装此 Vender 的 App 时,IDFV 的值和之前也不同。
IDFV 的获取方式如下
UIDevice *device = [UIDevice currentDevice];
NSUUID *rv = device.identifierForVendor;
if (rv) {
NSLog(rv.UUIDString);
}
如果用户在设备重启后没有解锁,而应用已经在后台执行任务期间或在推送时被唤醒了,则可能获取到的 IDFV 是 nil。
- IDFA-Identifier For Advertising(广告标识符)
可以理解为广告标识符,在同一个设备上的所有 App 都会取到相同的值,是苹果专门给各广告提供商用来追踪用户而设的。广告标示符是由系统存储着的。这个值并不唯一,用户可以在设置/隐私/广告中还原或禁止广告跟踪,在 iOS10 以后的设备如果选择禁止广告跟踪,则 IDFA 就会变成00000000-0000-0000-0000-000000000000
。因此它的获取方式如下
#import <AdSupport/AdSupport.h>
ASIdentifierManager *mgr = [ASIdentifierManager sharedManager];
if (mgr.isAdvertisingTrackingEnabled) {
NSUUID *rv = mgr.advertisingIdentifier;
NSLog(rv.UUIDString);
}
认证访问
大多数 app 采取自定义认证机制,需要注意
- 强制要求强密码,长度至少为六个字符,包含大小写字符
- 提供活跃连接列表,允许用户将其他设备或位置上的活跃连接取消
- 支持双因素身份验证,并在异常情况下使用
- 启用会话超时机制
- 永久登录的 app,确保 token 保存于 keychain 中
- 多次登录失败后启动 CAPTCHA
验证码的原名为CAPTCHA,是一大串英文的缩写:Completely Automated Public Turing test to tell Computers and Humans Apart,全自动区分电脑和人类的图灵测试。它的目的在于区分人眼与电脑程式,产生只有人类才能辨别的文字,以避免恶意程式攻击或垃圾留言。
网络安全
- CRIME 攻击
- BREACH 攻击
- 中间人攻击
一些建议:
- 禁用 HTTP 压缩,但是会增加传输数据量
- 从用户输入分离隐私,将授权码放在远离请求正文的地方
- 对每个请求随机加密,但是无法实现并行请求
- 修饰隐私,不以原始格式发送隐私
- 使用 CSRF 保护
- 隐藏长度,在 HTTP 响应中使用分块传输编码
- 对请求限速
- 证书锁定,通过只信任一个或几个能够作为应用根证书的证书,创建一个自定义的信任级别