iOS提供全盤加密戴尸,還為開發(fā)者提供了數(shù)據(jù)保護(hù)的API,用于進(jìn)一步保護(hù)自己的文件讹挎。這兩個機(jī)制可以實現(xiàn)遠(yuǎn)程抹除設(shè)備數(shù)據(jù)校赤,在設(shè)備丟失的情況下保護(hù)用戶數(shù)據(jù)免于泄露。
全盤加密其實解決了一個歷史問題:用戶數(shù)據(jù)會隨設(shè)備一起被竊取筒溃。在筆記本或者臺式機(jī)的環(huán)境下马篮,如果想竊取數(shù)據(jù),要么需要將硬盤轉(zhuǎn)移到一個新機(jī)器上怜奖,要么引導(dǎo)一個操作系統(tǒng)來讀取設(shè)備中的數(shù)據(jù)。文件系統(tǒng)加密并不能防止從一個正在運行的設(shè)備上竊取數(shù)據(jù)的行為歪玲。如果一個應(yīng)用可以從磁盤中讀取任意一個文件迁央,那么文件系統(tǒng)加密其實是沒有任何作用的,因為對于系統(tǒng)內(nèi)核來說滥崩,任何嘗試讀取這些文件的進(jìn)程都是透明解密的岖圈。相比于那些讀文件的調(diào)用行為,文件系統(tǒng)加密工作在更底層钙皮。一旦攻擊者攻破了系統(tǒng)驗證蜂科,那他就能無障礙的讀取任何文件。
iOS設(shè)備通常是全天運行設(shè)計短条,他們的內(nèi)部存儲器不容易被拆卸导匣。如果一個攻擊者想要不通過驗證就從設(shè)備中讀取敏感信息,他必須把設(shè)備完全拆解茸时,然后將閃存存儲器連接到一個自定義的接口上來讀取數(shù)據(jù)贡定。不過從設(shè)備中獲取數(shù)據(jù)有更為簡單的方法,而不用拆手機(jī)(畢竟拆手機(jī)這種事情一般人也做不來):代碼執(zhí)行漏洞可都、越獄等缓待。
iOS的全盤文件系統(tǒng)加密對于安全刪除文件和遠(yuǎn)程設(shè)備擦除蚓耽。傳統(tǒng)的安全擦除文件的方法不適用于iOS設(shè)備命浴,因為iOS設(shè)備主要使用固態(tài)硬盤(SSD)作為存儲烘跺。固態(tài)硬盤的原理這里不再贅述,相信大家也都了解一些智润。SSD采用了減少磨損的機(jī)制国葬,因此覆蓋文件的操作無法保證真正覆蓋硬盤中的舊數(shù)據(jù)贤徒。但是這不意味著我們對此束手無策,解決方法是確保文件被一個安全位置上的密鑰加密汇四,這樣請求銷毀數(shù)據(jù)的時候接奈,可以直接丟棄密鑰。iOS設(shè)備中使用的加密密鑰是分層級的通孽,只需要簡單地丟棄一個加密密鑰就能徹底銷毀底層的數(shù)據(jù)序宦,甚至是銷毀整個文件系統(tǒng)(不得不說當(dāng)時設(shè)計這個規(guī)則的人是真厲害)。
加密密鑰的層級:
分層級的加密密鑰其實是說用密鑰來加密其他密鑰背苦,這樣蘋果就能更精確的控制數(shù)據(jù)什么時候可用互捌。
它們的層級關(guān)系是這樣的:
設(shè)備密鑰+用戶密碼->層級密鑰
設(shè)備密鑰->文件系統(tǒng)密鑰->層級密鑰
層級密鑰->文件密鑰
文件密鑰(File Key)針對每個文件單獨生成,存儲在文件的元數(shù)據(jù)中行剂。不同級別的文件需要使用不同強度的加密密鑰秕噪。
層級密鑰(Class Key)的作用是專門為那些特殊數(shù)據(jù)提供不同級別的保護(hù)。在早先的iOS版本中厚宰,默認(rèn)的保護(hù)等級是NSFileProtectionNone腌巾;但是從iOS5開始,默認(rèn)的保護(hù)等級變成了NSFileProtectionCompleteUntilFirstUserAuthentication铲觉。
文件系統(tǒng)密鑰(Filesystem Key)是一種全局加密密鑰澈蝙,當(dāng)元數(shù)據(jù)被層級密鑰加密后,我們使用文件系統(tǒng)密鑰來加密涉及文件安全的元數(shù)據(jù)撵幽。
設(shè)備密鑰(Device Key)通常被稱為UID密鑰灯荧,每臺設(shè)備唯一,只能通過硬件的AES引擎訪問盐杂,操作系統(tǒng)無法直接獲取逗载。這是系統(tǒng)的主密鑰,他用來加密文件系統(tǒng)密鑰和層級密鑰况褪。如果用戶啟用了用戶密碼(User Passcode),他將與設(shè)備密鑰結(jié)合起來加密層級密鑰更耻。
一旦設(shè)置了用戶密碼测垛,這個密鑰等級也允許開發(fā)者自己決定本地存儲的數(shù)據(jù)該如何被保護(hù),包括:在設(shè)備鎖定時能否被訪問秧均、數(shù)據(jù)能否備份到其它設(shè)備等食侮。
鑰匙串API
iOS提供了鑰匙串API來存儲少量機(jī)密信息号涯。開發(fā)者可以用來存儲密碼、機(jī)密密鑰以及那些不能被其他應(yīng)用訪問的敏感信息锯七。調(diào)用鑰匙串API主要通過securityd守護(hù)進(jìn)程來完成链快,即從SQLite數(shù)據(jù)庫中提取數(shù)據(jù)。開發(fā)者可以指定在什么情況下允許應(yīng)用讀取密鑰眉尸,這和數(shù)據(jù)保護(hù)的API類似域蜗。
數(shù)據(jù)保護(hù)API
數(shù)據(jù)保護(hù)API利用文件系統(tǒng)加密、鑰匙串和用戶密碼噪猾,提供了一個額外的針對文件的保護(hù)層霉祸,開發(fā)者可以根據(jù)需求調(diào)用。這限制了某些進(jìn)程在系統(tǒng)層面讀取文件袱蜡。這個API最常用的場景就是當(dāng)設(shè)備鎖定時確保數(shù)據(jù)不可用丝蹭。
數(shù)據(jù)保護(hù)的強度在很大程度上取決于iOS的版本。隨著版本更新坪蚁,默認(rèn)的數(shù)據(jù)保護(hù)等級會發(fā)生變化奔穿。在新創(chuàng)建的iOS應(yīng)用程序中,數(shù)據(jù)保護(hù)默認(rèn)對所有應(yīng)用程序開啟敏晤,這種狀態(tài)在啟動設(shè)備后的第一次解鎖前都生效贱田。你可以在項目的Capabilities里找到Data Protection這個選項。