ios安全專題
- - posted by luo
對於未越獄的ios設備,由於強大的沙盒和授權機制,以及蘋果自己管理appStore,基本上杜絕了惡意軟件的入侵。但除了系統安全以外,我們還面臨網絡安全和數據安全。
1. 網絡安全之HTTPS
從數據包解析角度分析,HTTPS與HTTP沒有區別,HTTPS就是將HTTP協議數據包放到SSL/TSL層加密後,在TCP/IP層組成IP數據報去傳輸,以此保證傳輸數據的安全;而對於接收端,在 SSL/TSL將接收的數據包解密之後,將數據傳給HTTP協議層,就是普通的HTTP數據。HTTP和SSL/TSL都處於OSI模型的應用層。從HTTP轉換到HTTPS需要經過SSL/TSL層加密,在這一層,SSL/TSL通過四次握手主要交換三個信息:
1. 數字證書:該證書包含了公鑰等信息,一般是由服務器發給客戶端,接收方通過驗證這個證書是不是由信賴的CA簽發,或者與本地的證書相對比,來判斷證書是否可信;假如需要雙向驗證,則服務器和客戶端都需要發送數字證書給對方驗證;
2. 三個隨機數:這三個隨機數構成了後續通信過程中用來對數據進行對稱加密解密的“對話密鑰”。
首先客戶端先發第一個隨機數N1,然後服務器回了第二個隨機數N2(這個過程同時把之前提到的證書發給客戶端),這兩個隨機數都是明文的;而第三個隨機數 N3(這個隨機數被稱爲Premastersecret),客戶端用數字證書的公鑰進行非對稱加密,發給服務器;而服務器用只有自己知道的私鑰來解密,獲取第三個隨機數。只有,服務端和客戶端都有 了三個隨機數N1+N2+N3,然後兩端就使用這三個隨機數來生成“對話密鑰”,在此之後的通信都是使用這個“對話密鑰”來進行對稱加密解密。因爲這個過 程中,服務端的私鑰只用來解密第三個隨機數,從來沒有在網絡中傳輸過,這樣的話,只要私鑰沒有被泄露,那麼數據就是安全的。至於爲何要用三個隨機數,其實就是爲了儘量保證隨機數真正隨機。
3. 加密通信協議:就是雙方商量使用哪一種加密方式,假如兩者支持的加密方式不匹配,則無法進行通信;
數字證書
數字證書是一個電子文檔,其中包含了持有者的信息、公鑰以及證明該證書有效的數字簽名。而數字證書以及相關的公鑰管理和驗證等技術組成了PKI(公鑰基礎設施)規範體系。一般來說,數字證書是由數字證書認證機構(Certificate authority,即CA)來負責簽發和管理,並承擔PKI體系中公鑰合法性的檢驗責任;數字證書的類型有很多,而HTTPS使用的是SSL證書。
2. 實現支持HTTPS
目前常用的支持iOS應用的HTTPS有兩種方式,它們是NSURLConnection和AFN。由於目前大部分公司都使用AFN來操作網絡,所以本文以AFN展示支持HTTPS的具體實現。
NSURL *url = [NSURL URLWithString:@"https://www.google.com"];
AFHTTPRequestOperationManager *requestOperationManager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
dispatch_queue_t requestQueue = dispatch_create_serial_queue_for_name("kRequestCompletionQueue”);
requestOperationManager.completionQueue = requestQueue; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//allowInvalidCertificates 是否允許無效證書(也就是自建的證書),默認爲NO
//如果是需要驗證自建證書,需要設置爲YES
securityPolicy.allowInvalidCertificates = YES;
//validatesDomainName 是否需要驗證域名,默認爲YES;
//假如證書的域名與你請求的域名不一致,需把該項設置爲NO
//主要用於這種情況:客戶端請求的是子域名,而證書上的是另外一個域名。因爲SSL證書上的域名是獨立的,假如證書上註冊的域名是www.google.com,那麼mail.google.com是無法驗證通過的;當然,有錢可以註冊通配符的域名*.google.com,但這個還是比較貴的。
securityPolicy.validatesDomainName = NO;
//validatesCertificateChain 是否驗證整個證書鏈,默認爲YES
//設置爲YES,會將服務器返回的Trust Object上的證書鏈與本地導入的證書進行對比,這就意味着,假如你的證書鏈是這樣的:
//那麼,除了導入*.google.com之外,還需要導入證書鏈上所有的CA證書(GeoTrust Global CA, Google Internet Authority G2);
//如是自建證書的時候,可以設置爲YES,增強安全性;假如是信任的CA所簽發的證書,則建議關閉該驗證;
securityPolicy.validatesCertificateChain = NO;
requestOperationManager.securityPolicy = securityPolicy;