深刻了解安全相关书籍:《Hacking and Securing iOS Applications: Stealing Data, Hijacking Software, and How to Prevent It 》,《黑客攻防技术宝典:iOS实战篇》,《iOS Application Security: The Definitive Guide for Hackers and Developers》php
为设备建立惟一的标识符: 供应商的标识符(IDFV-identifierForVendor) 广告商的标识符(IDFA-identifierForldentifier)html
//检索IDFV -(NSString *)idfv{ UIDevice *device = [UIDevice currentDevice]; NSUUID *rv =device.identifierForVendor; while (!rv) { [NSThread sleepForTimeInterval:0.005]; rv = device.identifierForVendor; } return rv.UUIDString; } //检索IDFA -(NSString *)idfa{ //#import <AdSupport/ASIdentifierManager.h> ASIdentifierManager *mgr = [ASIdentifierManager sharedManager]; if (mgr.isAdvertisingTrackingEnabled){ NSUUID *rv = mgr.advertisingIdentifier; while (!rv) { [NSThread sleepForTimeInterval:0.005]; rv = mgr.advertisingIdentifier; } return rv.UUIDString; } return nil; }
http://www.jianshu.com/p/0ba161cff01e http://www.cocoachina.com/industry/20130422/6040.htmlweb
当须要识别用户时,须要认证访问。浏览器
#include <GameKit/GameKit.h>//1.GameKit头文件,需加入GameKit.framework -(void)authWithGameCenter{ GKLocalPlayer __weak *player = [GKLocalPlayer localPlayer];//2.GKLocalPlayer表示运行游戏的已认证玩家。任什么时候刻,设备上只能有一个认证玩家 if (!player.authenticated){//3.检查玩家是否经过认证 player.authenticateHandler = ^(UIViewController * _Nullable viewController, NSError * _Nullable error) {//4.authenticateHandler触发受权 if (error){ //处理错误 }else if (viewController){//5.若是用户之前没有受权与Gamekit链接,那么在回调中返回的 视图控制器必须显示出来 [self presentViewController:viewController animated:YES completion:nil]; }else{ GKLocalPlayer *lp = player; if (lp){ [self verifyLocalPlayer:lp];//6.正常流程获取用户详细信息 } } }; }else{ [self verifyLocalPlayer:player]; } } -(void)verifyLocalPlayer:(GKLocalPlayer *)player{ [player generateIdentityVerificationSignatureWithCompletionHandler:^(NSURL * _Nullable publicKeyUrl, NSData * _Nullable signature, NSData * _Nullable salt, uint64_t timestamp, NSError * _Nullable error) {//7.获取签名,从而验证本地玩家 if (error){ }else{ //player id = player.playerID //使用数据核实 实际的验证应给服务器端 } }]; }
讨论在于远程设备通讯中与安全有关的最佳实践,该远程设备能够是服务器,也能够是点对点设备。缓存
1.CRIME攻击 不要使用SSL/TLS压缩.使用TLS压缩,任何请求都会受到CRIME攻击(英语:Compression Ratio Info-leak Made Easy,意思为:压缩率使信息容易泄露)。要想缓解风险,能够关闭TLS压缩,并给每一个响应发送反CRIME cookie,较为简单的方式是发送一个惟一的随机序列cookie。 https://zh.wikipedia.org/wiki/CRIME,http://www.freebuf.com/articles/web/5636.html安全
2.BREACH攻击 (全称:Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext的缩写,意为“经过自适应超文本压缩作浏览器侦听和渗透”)。 知足下列标准,就会存在风险:服务器
http://www.breachattack.com 网站按有效性列出一下方法下降风险:cookie
HTTPS的基础是对公钥的信任,该公钥用于加密初始信息(在SSL握手期间)。中间人(man-in-the-middle,MITM)攻击会捕获用于加密消息的密钥。网络
这个问题的解决方案就是所谓的证书锁定。这种方案的工做原理是,经过只信任一个或几个可以做为应用根证书的证书,应用建立一个自定义的信任级别。这容许应用仅信任来自白名单的证书,确保设备上用不安装那些容许网络见识的未知证书。ide
参考文章:http://www.jianshu.com/p/f732749ce786,https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning#iOS
保护本地存储空间遵循的最佳实践:
默认状况下,启用数据保护后,应用使用的全部本地存储都将使用设备密码进行加密。这意味着在设备解锁前没法访问数据。 在Apple Developer门户上配置安全级别。
数据保护的安全级别共享和权限选项:(sharing and permissions)
共享数据和处理传入数据时遵循的简单基本规则是:不要信任对方。 当接受数据时,老是进行验证。应用对数据的惟一假设应该是,它多是无效且错误的。为了提升安全性,要求数据进行签名。
静态代码分析
是否使用了NSLog,若是是,仅在调式模式中使用
全部的URL都是HTTPS
本地文件的路径不是硬编码的
检查最新版本和补丁程序的依赖关系
没有使用私有API
代码中没有嵌入私钥或隐私
资源中没有嵌入私钥或隐私
没有运行不到的代码或无用代码
权利是正确的(没有丢失,没有附加)
应用使用了IDFV
应用使用了IDFA
为应用签名设置正确的配置文件/证书
检查SQL注入
运行时分析--日志
仅对文件执行日志记录
按期删除日志文件
执行日志循环
日志中没有隐私或敏感信息
打印栈跟踪时不会记录敏感信息
运行时分析--网络
只使用HTTPS URL
服务器有针对CRIME攻击的实现
服务器和客户端应用有针对BREACH攻击的实现
客户端使用证书锁定
设置正确的缓存策略
运行时分析--认证
应用使用第三方身份验证
应用使用自定义身份验证
第三方验证SDK按照此清单的其他部分进行严格的审核
登录UI隐藏了密码
密码不可复制
应用实现密码
密码存储在钥匙串中
能够经过服务器的配置更改身份验证工做流
运行时分析--本地存储
应用使用本地存储
加密全部的敏感信息
周期性清理存储
运行时分析--数据共享 应用使用共享秘钥库保存常见设置 验证深层连接URL 验证任何传入的数据 不向未知应用共享任何敏感数据 使用应用扩展时,设置正确的群组ID