WWDC2016 開發(fā)者大會上 Apple 曾宣布自2017年起 AppStore 中的所有 App 都必須啟用? ATS 安全功能。啟用 ATS 后, 明文 HTTP 資源加載將被屏蔽, App 需通過 HTTPS 連接網(wǎng)絡(luò)服務(wù),實(shí)現(xiàn)傳輸加密,保障用戶數(shù)據(jù)安全。
雖然上述條款已被無限期 Delay,但是從中可以投射出 Apple 對于傳輸數(shù)據(jù)安全的重視。Apple 為什么要限制 HTTP?
因?yàn)?HTTP 通過明文傳輸,沒有經(jīng)過任何安全處理,且很容易受到中間人攻擊,比如:通過重定向把客戶端的請求轉(zhuǎn)到一個(gè)李鬼服務(wù)器;查看客戶端敏感信息;或者偷偷修改客戶端的請求/響應(yīng)數(shù)據(jù)包。所以 Apple 才迫切地想要引入 HTTPS。
那 HTTPS 如何來保證傳輸安全?HTTPS ( HTTP over SSL) 即基于安全套接字層的超文本傳輸協(xié)議,是最初由 Netscape 開發(fā)的 Web 協(xié)議。
HTTPS 握手流程:
HTTPS 在 HTTP 基礎(chǔ)上添加了SSL/TLS加密傳輸協(xié)議,其握手流程大概如下:
1)客戶端—>服務(wù)器 ?發(fā)起請求
客戶端發(fā)起請求到服務(wù)器。主要參數(shù)是支持的協(xié)議版本,加密方法還有隨機(jī)數(shù)n1;
2)服務(wù)器 收到請求
服務(wù)器收到請求并確認(rèn)加密方法,并返回公鑰,還有一個(gè)由服務(wù)器生成的隨機(jī)數(shù)n2;
3)服務(wù)器—>客戶端 發(fā)送證書,客戶端驗(yàn)證證書
這部分工作在 iOS 中 CA 認(rèn)證的證書會自動驗(yàn)證,而私有證書則需要手動驗(yàn)證放行,否則拒絕連接;
4)客戶端—>服務(wù)器 發(fā)送信息
客戶端驗(yàn)證證書成功后會生成第三個(gè)隨機(jī)數(shù)n3,并用第2步服務(wù)器返回的證書對該隨機(jī)數(shù)加密,并發(fā)送給服務(wù)器,同時(shí)也會發(fā)送一些其他信息比如:編碼信息和客戶端握手結(jié)束通知。
5)服務(wù)器—>客戶端 發(fā)送信息
服務(wù)器用私鑰解密后,得到客戶端傳來的第三個(gè)隨機(jī)數(shù)n3,兩端使用這三個(gè)隨機(jī)數(shù)n1,n2,n3來生成“Session Key”。服務(wù)器向客戶端發(fā)送編碼信息和服務(wù)器握手結(jié)束通知。
6)完整性驗(yàn)證
完整性驗(yàn)證成功之后,后面的信息傳輸就靠這個(gè)“Session Key”進(jìn)行對稱加密了。
SSL 在握手的過程中主要交換了以下三個(gè)信息:
加密通信協(xié)議:就是雙方商量使用哪一種加密方式,假如兩者支持的加密方式不匹配,則無法進(jìn)行通信。
數(shù)字證書:該證書包含了公鑰等信息,一般是由服務(wù)器發(fā)給客戶端,接收方通過驗(yàn)證這個(gè)證書是不是由信賴的 CA 簽發(fā),或者與本地的證書相對比,來判斷證書是否可信;假如需要雙向驗(yàn)證,則服務(wù)器和客戶端都需要發(fā)送數(shù)字證書給對方驗(yàn)證。
三個(gè)隨機(jī)數(shù)n1,n2,n3:這三個(gè)隨機(jī)數(shù)構(gòu)成了后續(xù)通信過程中用來對數(shù)據(jù)進(jìn)行對稱加密解密的“對話密鑰”。
中間人攻擊:
中間人攻擊是通過與客戶端、服務(wù)器分別建立連接,來獲得了明文的信息的攻擊方式。在這個(gè)過程中,客戶端與服務(wù)器的通信被第三方解密、查看、修改。
為什么有一些 APP 即便使用了 HTTPS,還是會被中間人攻擊呢?
基本上的都是因?yàn)闆]做客戶端驗(yàn)證,特別是在使用未經(jīng) CA 認(rèn)證的證書時(shí),更容易中招。關(guān)于黑客是如何在協(xié)議握手初期劫持服務(wù),從而實(shí)現(xiàn)中間人攻擊,我們可以做如下推演:
黑客劫持到服務(wù)器公鑰,并冒充客戶端與服務(wù)器連接;
黑客自己生成公鑰冒充服務(wù)器公鑰返回給真正的客戶端;
如果客戶端未做驗(yàn)證的話,就不會發(fā)現(xiàn)證書被替換,于是客戶端會用黑客的公鑰加密發(fā)送數(shù)據(jù);
黑客劫持?jǐn)?shù)據(jù)后,用自己的私鑰解密,查看或者篡改;
黑客用真正的服務(wù)器公鑰加密篡改后的數(shù)據(jù)與服務(wù)器進(jìn)行通訊。
由此可以看出,我們需要做好客戶端驗(yàn)證,比如:把證書打包進(jìn) APP,然后與服務(wù)器返回的證書作對比驗(yàn)證,驗(yàn)證成功才允許連接。
當(dāng)然使用這種方式也會導(dǎo)致一些問題,比如:當(dāng)證書過期時(shí) APP 連不上服務(wù)器,這時(shí)可能需要我們提前把新證書打包進(jìn) APP 中,來實(shí)現(xiàn)無縫切換。
結(jié)語
由于?iOS 平臺的封閉性,許多?iOS 開發(fā)人員在安全性方面沒有進(jìn)行深入。
實(shí)際的做為 iOS 開發(fā)者,我們需要在理解 HTTPS 的基礎(chǔ)上,來確保連接的安全性,給傳輸數(shù)據(jù)上把鎖。
本文作者:魏金豹(點(diǎn)融黑幫),現(xiàn)任點(diǎn)融工程部高級移動開發(fā)工程師。