深刻了解安全相關書籍:《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