九.安全

九.安全

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

9.1 應用訪問

9.1.1 匿名訪問

爲設備建立惟一的標識符: 供應商的標識符(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

9.1.2 認證訪問

當須要識別用戶時,須要認證訪問。瀏覽器

  • 應用密碼(應用PIN):存儲在設備本地的密碼。使用鑰匙串在本地存儲密碼。
  • 遊戲中心(僅使用遊戲):用GameKit鏈接遊戲中心,後者會負責使用憑證對用戶進行驗證。遊戲中心能夠訪問用戶資料,我的記錄等,但僅共享惟一標識用戶所需內容。
#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.強制要求使用強密碼。
    2.提供會話列表,並容許用戶將其餘設備或位置上的現有會話設爲無效。
    3.啓用會話超時機制。
    4.對於永久登錄,確保訪問令牌存儲在本地的鑰匙串中。

9.2 網絡安全

討論在於遠程設備通訊中與安全有關的最佳實踐,該遠程設備能夠是服務器,也能夠是點對點設備。緩存

9.2.1 使用HTTPS

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壓縮
  • 響應反映了用戶輸入。
  • 響應反映了隱私。

http://www.breachattack.com 網站按有效性列出一下方法下降風險:cookie

  • 禁用HTTP壓縮。這種方法增長了傳輸的數據量,通常不做爲實際的解決方案。
  • 從用戶輸入分離出隱私。將受權碼放在遠離請求正文的地方。
  • 對每一個請求進行隨機化的加密。可是,因爲每一個請求的加密是隨機的,所以,多個並行請求可能沒法實現了。
  • 修飾隱私。不要以原始格式發送隱私。
  • 使用CSRF保護易受攻擊的HTML頁面。在移動原生應用上,除非使用移動Web,不然不須要CSRF。https://zh.wikipedia.org/wiki/跨站請求僞造
  • 隱藏長度。一個較好的方法是在HTTP響應中使用分塊傳輸編碼。
  • 對請求限速。

9.2.2 使用證書鎖定

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

9.3 本地存儲

保護本地存儲空間遵循的最佳實踐:

  • 本地存儲不安全:在越獄的設備上很是容易訪問本地存儲。服務器應實現額外的安全性,使用速率限制技術和加強的DDoS保護措施來進行防衛。
  • 加密本地存儲:在Xcode中啓用數據保護。 輸入圖片說明

默認狀況下,啓用數據保護後,應用使用的全部本地存儲都將使用設備密碼進行加密。這意味着在設備解鎖前沒法訪問數據。 在Apple Developer門戶上配置安全級別。

數據保護的安全級別共享和權限選項:(sharing and permissions)

  • 安全保護:在任什麼時候候訪問文件進行讀取或寫入時,設備都須要是解鎖狀態的。
  • 打開前保護:這須要在建立文件句柄時解鎖設備,一旦句柄可用,則設備鎖定時也能夠寫入內容。這一選項在設備已經鎖定,但還須要對文件進行寫入時比較有用。
  • 第一個用戶認證前保護:這須要設備在從新啓動後進行一次解鎖。第一次解鎖後,應用能夠訪問全部文件,而且沒有任何限制。
  • NSUserDefaults 不安全。plist文件是與其餘應用文件一塊兒保存的。
  • NSBundle值也不安全。包含值的.plist文件其實是能夠被篡改的。
  • 不要徹底依靠鑰匙串:能夠對存儲在密鑰庫中的數據進行加密,並只存儲最少的數據。還能夠針對每一個設備生成密鑰,並在本地存儲。最好的作法是讓攻擊者更加那必定位和解密數據。若是攻擊者能夠物理訪問設備,能作的也只有這些。
  • 當心記錄的東西:不要在非調試版本中使用NSLog,會在View Device Log看到全部日誌。(CocoaLumberjack庫)

9.4 數據共享

共享數據和處理傳入數據時遵循的簡單基本規則是:不要信任對方。 當接受數據時,老是進行驗證。應用對數據的惟一假設應該是,它多是無效且錯誤的。爲了提升安全性,要求數據進行簽名。

9.5 清單

靜態代碼分析
是否使用了NSLog,若是是,僅在調式模式中使用
全部的URL都是HTTPS
本地文件的路徑不是硬編碼的
檢查最新版本和補丁程序的依賴關係
沒有使用私有API
代碼中沒有嵌入私鑰或隱私
資源中沒有嵌入私鑰或隱私
沒有運行不到的代碼或無用代碼
權利是正確的(沒有丟失,沒有附加)
應用使用了IDFV
應用使用了IDFA
爲應用簽名設置正確的配置文件/證書
檢查SQL注入

運行時分析--日誌
僅對文件執行日誌記錄
按期刪除日誌文件
執行日誌循環
日誌中沒有隱私或敏感信息
打印棧跟蹤時不會記錄敏感信息

運行時分析--網絡
只使用HTTPS URL
服務器有針對CRIME攻擊的實現
服務器和客戶端應用有針對BREACH攻擊的實現
客戶端使用證書鎖定
設置正確的緩存策略

運行時分析--認證
應用使用第三方身份驗證
應用使用自定義身份驗證
第三方驗證SDK按照此清單的其他部分進行嚴格的審覈
登錄UI隱藏了密碼
密碼不可複製
應用實現密碼
密碼存儲在鑰匙串中
能夠經過服務器的配置更改身份驗證工做流

運行時分析--本地存儲
應用使用本地存儲
加密全部的敏感信息
週期性清理存儲

運行時分析--數據共享 應用使用共享祕鑰庫保存常見設置 驗證深層連接URL 驗證任何傳入的數據 不向未知應用共享任何敏感數據 使用應用擴展時,設置正確的羣組ID

相關文章
相關標籤/搜索