2007年,谷歌公司發布基于Linux系統内核的開源智能手機操作系統“安卓(Android)”。經過近八年的發展,安卓系統已經從最初的智能手機領域進入汽車、教育、電視、平闆電腦等行業。根據市場研究公司Strategy Analytics(SA)最新的報告,2014年智能手機總出貨量為13億台,其中安卓系統占有率達81.2%。
盡管安卓設備用戶的數量龐大,其安全意識卻有待增強。美國在年度《消費者報告》(Consumer Reports)中指出,在美國有近40%的手機用戶沒有采取适當的安全措施。同時,用戶個人數據洩露問題也日益突出:手機丢失或被竊導緻手機上存儲的個人信息洩露;用戶淘汰舊手機時,即使删除全部數據,手機中的部分數據也可以恢複;惡意軟件利用系統漏洞也可能非法獲取用戶的個人數據。
為提高數據存儲的安全性,谷歌從Android 3.0開始,在安卓系統上提供了可選的磁盤加密解決方案,但由于加密性能等原因,并未被普遍采用。2015年9月底發布的Android 6.0中,谷歌提出了更高級别的全盤加密要求,要求廠商在新推出的設備上啟用全盤加密(即使在沒有設置屏幕解鎖密碼的情況下也需要全盤加密),同時達到了良好的性能要求。全盤加密提供了離線數據保護功能,增強了安卓設備的安全性。
全盤加密技術(Full Disk Encryption,FDE)屬于動态加密,安卓全盤加密基于 Linux系統的設備映射框架dmcrypt實現∫對用戶數據分區的透明加密存儲。啟用全盤加密功能後,所有寫入到磁盤的内容都會在提交寫入之前被自動加密,而所有從磁盤讀取的數據在交給應用程序前會自動解密。
在安卓設備中,由于“/system”目錄是隻讀的,不能存儲用戶個人數據,而數據分區(data)和T-Flash卡存儲了大量可讀寫的用戶數據,所以谷歌提出的全盤加密隻針對這兩部分進行。當應用程序需要讀取某一文件時,首先調用操作系統提供的應用程序接口(Application Program Interface,APD),操作系統調用磁盤加密模塊,将設備中存儲的加密數據讀取到内存中,内存中的數據解密後返回給操作系統,操作系統再将數據返回給應用程序。同樣,當應用程序需要寫入一段數據時,将數據提交給操作系統,由磁盤加密模塊在内存中對數據進行加密,再寫入到磁盤中。數據的加密與解密過程對于應用程序是完全透明的。
從Android 3.0到Android 6.0,谷歌不斷改進其全盤加密技術,不斷提高加密強度和性能。Android 5.0中默認啟用全盤加密功能,但由于性能問題,各廠家的缺省設置中并未啟用;Android 5.1中,全盤加密沒有默認開啟,而是标明“強烈推薦”;Android 6.0中,谷歌強制要求新設備默認開啟全盤加密功能,而現有設備系統升級到Android 6.0之後沒有要求默認開啟。
安卓全盤加密使用AES-CBC加密算法,數據分區的每個扇區都被分别加密,AES密鑰的安全性十分重要。在安卓磁盤加密中,用于加密磁盤的主密鑰是随機生成的,由鎖屏密碼或PIN碼(Personal Identification Number,SIM卡的個人識别密碼)進行保護,主密鑰經過加密後保存在元數據分區中。
(1)Android 3.0-4.3的全盤加密
從Android 3.0到Android 4.3中,均使用crypto footer結構保存加密的參數國,它在 Linux系統内核中LUKS結構的基礎上進行了一些簡化:LUKS支持多個密鑰,并允許多個密鑰同時進行加密解密,而crypto footer隻存儲一個密鑰;LUKS中包含一個主密鑰校驗和,不用解密任何磁盤的數據即可檢查輸入密鑰是否正确,而crypto footer不包括校驗和,必須用輸入密鑰解密數據分區,獲得匹配結果後才能驗證密鑰(鎖屏密碼或PIN碼)正确與否。
安卓全盤加密功能初始化的過程中,系統首先随機生成一個128位的主密鑰和一個16位的值(salt value),然後由用戶輸入的密碼或者PIN碼與值結合,使用 PBKDF2(Password-Based Key Derivation Function2,基于密碼的密鑰派生功能)将其叠代2000次後得到一個128位的密鑰加密密鑰(Key Encryption Key,KEK),主密鑰則由這個密鑰通過AES算法進行加密。PBKDE2叠代過程同時會産生一個初始向量,作為AES-CBC算法的初始向量,用于加密主密鑰。Crypto footer将加密後的主密鑰與鹽值保存到元數據分區。
安卓設備啟動時,系統讀取crypto footer中的鹽值,結合用戶輸入的PIN碼或密碼,使用PBKDF2叠代得到加密主密鑰的密鑰和初始向量,解密獲得主密鑰,提交給dmcrypt,解密數據分區。在安卓系統中,鎖屏PIN碼或密碼最大長度為16個字符。多數情況下,用戶鎖屏密碼設置得比較簡單,全盤加密能夠被破解。加密後的主密鑰和鹽值存儲在磁盤的元數據分區上。破解者可以讀取到鹽值,嘗試窮舉所有的PIN碼或密碼,用PBKDE2算法得到主密鑰的加密密鑰的所有密鑰值。再分别用這些密鑰值解密主密鑰,嘗試解密磁盤。由于手機平台計算能力有限,還可以将手機數據分區和存儲crypto footer的元數據分區拷貝到性能更強大的PC機上,去嘗試破解密碼。在這種方案中,4位的PIN碼極易被破解,因此需要設置更長的鎖屏密碼來保證全盤加密的安全性。
(2)Android 4.4的全盤加密在Android 4.4中,谷歌對全盤加密進行了改進,主要是用新的密鑰推導函數Scrypt替換了原有的PBKDE2算法。Scrypt在計算時需要大量的内存,不适合使用GPU進行破解。Santoku是一個基于Linux系統的Python腳本,能夠實現對Android 4.4全盤加密的破解,在酷睿i7 CPU上暴力破解4位PIN碼大約花費30分鐘。因此,Scrypt方案與BKDF2方案相比,大大提高了破解難度。
(3)Android 5.0的全盤加密在Android 5.0中,谷歌對全盤加密功能添加了硬件關聯,引人了可信執行環境(Trusted Execution Environment,TEE)簽名。為了讓主密鑰能夠抵抗離線攻擊,擴展了主密鑰加密算法,增加了使用可信執行環境密鑰對AES加密密鑰的簽名過程。以這種新的加密方式産生的加密主密鑰,幾乎無法使用暴力破解。可信執行環境是智能手機CPU中的一塊安全區域,它确保隐秘的數據能夠在獨立的、可信賴的環境中存儲、處理并受到保護。可信執行環境能夠為受信任的應用程序提供獨立安全的執行空間,通過強制保護認證代碼的執行來保障端到端的安全,并且具有機密性、真實性、隐私性、系統完整性以及數據訪問權限等特點。此外,可信執行環境還提供高速計算能力和内存訪問控制。
Android 5.0中密鑰生成的過程為:
1. 随機生成16字節的磁盤加密密鑰(DEK,即主密鑰)和16字節的鹽值。
2. 将用戶輸入的密碼和鹽值作為Scrypt的輸入,産生一個32字節的臨時密鑰IK1。
3. 将臨時密鑰IK1及“0”填充到硬件私鑰中。例如,硬件使用RSA加密算法,其私鑰大小為2048位,IK1表示為:00 || IK1 || 00···00,即1字節的“0”、32字節的IK1、233字節的“0”,一共256字節,2048位。
4. 可信執行環境對填充的IK1進行簽名,得到256字節的臨時密鑰IK2。
5. 将IK2和鹽值作為Scrypt 的輸入,産生32字節的臨時密鑰IK3。
6. 将IK3的前16字節作為AES-CBC算法的加密密鑰,IK3的後16字節作為初始向量 (Initialization Vector,IV)。
7. 使用AES-CBC算法對主密鑰進行加密。
顯然,在獲得crypto footer的情況下,由于可信執行環境的硬件簽名功能,使得破解者無法從PIN碼的計算中得到加密密鑰,因此這種破解方式不再可行。
(4)Android 6.0全盤加密一般觀點認為,安卓系統在隐私保護上與iOS相比處于劣勢,iOS已經對用戶數據強制進行了離線加密,聲稱蘋果公司或是政府機構也不能直接恢複這些數據。随着Android 6.0的發布,谷歌在安卓兼容性定義文檔(Compatibility Definition Document,CDD)中将全盤加密作為要求,而不是建議。對于内存容量大于512MB的設備,如果它支持安全鎖屏,那麼也必須支持全盤加密。此外,如果設備的AES加密性能高于50MB/s,必須默認啟用全盤加密功能。該文件還規定了必須使用128位或更長的AES密鑰,不允許将加密密鑰寫入存儲區域等。可以預見,這一舉措使得執法人員對安卓設備的取證變得更加困難。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!