鄭 東, 韓星玥, 楊中皇,2
(1.西安郵電大學 無線網絡安全技術國家工程實驗室, 陜西 西安 710121;2.高雄師范大學 軟件工程與管理學系, 臺灣 高雄 82444)
移動終端智能設備已從最初的智能手機領域進入教育、醫療、軍事等重要行業。智能手機逐漸取代個人電腦成為人類生活、工作和學習中不可或缺的一部分[1-2]。基于Linux的Android手機操作系統[3]是目前最熱門的移動操作系統之一。Android手機代碼的開源性,導致其逐漸成為大量惡意攻擊者的首選目標之一[4]。美國《消費者報告》2012年度“State of the Net”報告指出,近40%的美國手機用戶沒有采取適當的安全措施,在賬戶未經準許的情況下,560萬人被擅自訪問[5]。TrustGo公司分析應用報告顯示,在Google Play上,3.15%的應用有可能泄露用戶隱私或者存在惡意行為。而在中國國內知名的91應用市場上,該比例則為19.7%。同時,大量的第三方應用市場的存在,對于Android設備的安全造成了嚴重的威脅。
隨著智能手機的普及,不論是個人,還是企業或政府單位都不可避免地用到自帶設備(bring your own device, BYOD)[6]。但是,現有網絡安全設備存在局限性,使得惡意軟件能夠通過智能手機轉移到PC或服務器上,可以實現對隱私的竊取。高級加密標準(advanced encryption standard, AES)、橢圓曲線數字簽名算法(elliptic curve digital Signature algorithm, ECDSA)和安全哈希算法(secure hash algorithm, SHA)等是智能手機所用的核心密碼算法,但是,這些算法不符合中國商用密碼規范,其安全性不適用于所有的智能終端,并且用戶的資料預設儲存在國外,難以保護中國消費者的隱私。目前,國家密碼管理局公布了適用于商用和軍用等的密碼算法,同時,SM2橢圓曲線公鑰密碼算法與SM9標識密碼算法[7]也已成為國際標準。
本文將滿足我國商用密碼規范的密碼算法SM2/SM3/SM4算法添加到Android源碼中,以期為Android系統提供更加健全的加密機制。
Android系統[8]架構從下到上依次是Linux內核層、系統庫與運行時庫層、應用程序框架層和應用程序層,如圖1所示。這種層次化設計既能夠為系統提供安全,還能夠保持操作系統的開放性。

圖1 Android系統框架
Linux內核層包括系統層安全機制、內存管理、進程管理、網絡堆棧及一系列的驅動模塊,位于硬件與其他的軟件層之間,提供與硬件交互。與此同時,還可以區別與阻隔該層與下一層,即使是該層自身產生了一些變化,也不會對任何一層產生影響。需要特別注意的是,內核層中不包含虛擬性的內存文件。
系統庫與運行時庫層包含了Android系統的系統庫、運行環境和應用框架層。系統函數庫與運行時庫層是為應用程序運行提供服務的一些C/C++庫;核心庫中既包含了Java核心類庫的大多數功能,也包含了利用Java本地調用(Java native interface,JNI)等方式封裝的C/C++庫,向應用框架層提供調用底層程序庫的接口,還包含了解釋運行Java字節碼的ART虛擬機。應用軟件架構層為應用開發者提供了用以訪問核心功能的應用程序接口(application program interface, API)。
在Android系統中,上層應用程序需利用Java語言開發。比如,通信工具、通訊錄等應用程序。
Android系統工具不僅包括Android調試橋(android debug bridge, ADB)和logcat等,還包括開發工具Gradle、TraceView和本地開發工具包(native development kits, NDK)等。
1.2.1 Android調試工具
ADB是一個可執行程序,位于軟件開發工具包(software development kit, SDK)安裝路徑下platform-tools目錄中,可快速建立與模擬器的通信渠道。ABD采用客戶端/服務器(Client/Server,C/S)模型,框架由ADB Client、ADB Server和ADB Daemon 等3個重要部分組成。
Logcat是一個命令行工具,用于得到程序對應的日志信息。Android日志系統提供了記錄和查看系統調試信息的功能。日志都是從各種軟件和某些系統的緩沖區中記錄,緩沖區可以通過logcat命令來查看和使用。
1.2.2 Android開發工具
Gradle是新一代自動化編譯工具,也是Android Studio中應用程序開發默認的自動化構建工具。它是在Ant、Maven等自動化編譯工具基礎上發展而來,使用了一種基于Groovy的特定領域語言(DSL)來聲明項目設置,拋棄了基于XML的各種繁瑣配置,具有Ant和Maven等工具的所有優點。Gradle也是一個基于Java虛擬機(java virtual machine, JVM)的構建工具,支持maven,Ivy倉庫,支持傳遞性依賴管理,而不需要遠程倉庫或者是pom.xml和ivy.xml配置文件。
Groovy和Java語法相似,并且可以達到二進制級別的兼容,對于JVM,兩者之間沒有任何區別。同時,Groovy還可以使用Java中的各類API,并且兩者可以進行混合編程。
Gradle的生命周具體包含Initialization、Configuration和Execuation共3個階段,如圖2所示。

圖2 Gradle的生命周期
TraceView是Android SDK中內置的工具,可以加載trace文件,用圖形的形式展示代碼執行時間、次數及棧的調用,便于分析進程中各個線程的執行情況。其中Trace文件可以通過代碼、Android Studio或者Dalvik虛擬機調試監控服務(dalvik debug monitor service, DDMS)生成。使用DDMS生成的trace文件,分析算法的執行及布局等。
NDK是一個工具集,可以開發C/C++動態庫,并能自動將動態鏈接庫(.so庫)打包到應用程序中。在Ubuntu Linux下,使用NDK工具集成的交叉編譯器編譯openssl源代碼,生成libcrypto.so動態庫;在Windows下,通過Android Studio中的NDK實現對動態庫打包。
Android系統基于Java加密體系結構(java cryptography architecture, JCA),并且JCA提供了一個可擴展的加密服務程序框架和一組API,即加密服務基于JCA保護系統安全。支持現有主要密碼原語,如分組密碼算法AES;消息摘要算法SHA-1和消息摘要算法(message digest algorithm, MD5);數字簽名算法ECDSA和RSA算法。
ECDSA[9]是使用橢圓曲線密碼(elliptic curves cryptography, ECC)對數字簽名算法(digital signature algorithm, DSA)的模擬。ECDSA于1999年成為美國國家標準學會(american national standards institute, ANSI)標準,并于2000年成為電氣和電子工程師協會(institute of electrical and electronics engineers, IEEE)和美國國家標準與技術研究院(national institute of standards and technology,NIST)標準。在1998年被國際標準化組織(international organization for standardization, ISO)所接受。
2001年,美國國家標準技術研究所發布了AES[10]算法,旨在取代DES[11],成為廣泛使用的標準。AES算法明文分組的長度為128位即16字節,密鑰長度可以為16字節,24字節或者32字節(128位,192位,256位)。AES算法加密過程涉及到4種操作:字節替代(SubBytes)、行移位(ShiftRows)、列混淆(MixColumns)和輪密鑰加(AddRoundKey)。
SHA算法是美國國家標準技術研究所發布的國家標準FIPS PUB 180,主要適用于數字簽名標準(digital signature standard, DSS)[12]里面定義的數字簽名算法DSA。其中規定了SHA-1、SHA-224、SHA-256、SHA-384和SHA-512共5種單向散列算法。
密碼學中常用的算法有對稱算法、非對稱算法和散列算法。為了提高算法的安全性,中國國家密碼管理局制定了一系列密碼標準及其應用規范,如SM1、SM2、SM3、SM4、SM9。其中已公布有SM2、SM3、SM9和SM4。
2.2.1 SM2橢圓曲線公鑰密碼算法
2010年12月,中國首次公開發布了SM2橢圓曲線公鑰密碼算法[13],2012年成為中國商用密碼標準(標準號為GM/T 0003-2012),2016年成為中國國家密碼標準(標準號為GB/T 32918-2016),2017年SM2數字簽名算法成為ISO/IEC國際標準,是中國公鑰密碼算法標準。SM2算法的主要內容包含數字簽名算法、密鑰交換協議和公鑰加密算法等。
2.2.2 SM3密碼雜湊算法
SM3[14-15]雜湊算法是中國國家密碼局于2010年12月17日公布的hash算法的商用標準。該標準可以對長度為l(l<264)比特的消息m,經過填充、迭代壓縮、生成雜湊值,其雜湊值的輸出為256比特。由于該標準使用了迭代壓縮結構,將填充后的原數據,通過布爾函數與置換邏輯處理,在壓縮過程中充分地進行擴散和擾亂,所以,SM3密碼雜湊算法具有較高的復雜性與不可逆性。
2.2.3 SM4分組密碼算法
由中國國家密碼管理局于2006年1月6日公布的分組加密算法,是無線標準中的分組加密算法,2012年改名為SM4[16]。該算法是一個分組算法,其分組長度為128比特,密鑰長度為128比特。加密算法與密鑰擴展算法都采用32輪非線性迭代結構。解密算法與加密算法的結構相同,只是輪密鑰的使用順序相反,解密密鑰是加密密鑰的逆序。
3.1.1 系統架構
在Android 8.0源代碼的基礎上,通過添加SM2/SM3/SM4密碼算法,實現對Android所提供加密服務安全性的改造,提高系統安全性和用戶隱私的完整性。利用Android Studio開發應用程序,通過性能分析工具TraceView,分析具有相同功能的不同函數;同時利用AOSP平臺,從Android網站上下載Android 8.0源代碼,在源碼中添加密碼算法,通過編譯源碼生成刷機的系統鏡像文件。
3.1.2 系統開發
在Linux系統下通過編譯修改后的Android 8.0源代碼,實現密碼算法SM2/SM3/SM4在Android系統中的應用。
系統APK“FIPS”的功能界面如圖3所示。點擊SM3,在彈出對話框中輸入“asdfghjkl”,輸出哈希摘要,如圖4所示。SM4加解密的過程分別如圖5和圖6所示。SM2加解密以及簽名驗證的過程分別如圖7-10所示。

圖3 FIPS功能界面

圖4 SM3哈希

圖5 SM4的加密過程

圖6 SM4的解密過程

圖7 SM2加密過程

圖8 SM2解密過程

圖9 SM2簽名過程

圖10 SM2驗證過程
3.2.1 測試環境
在Android中,CPU頻率可能會因功耗的變化而改變,從而影響設備的性能和測試結果的準確性。為了減少可能存在干擾源的影響,在測試之前,強制退出設備中所有非關鍵運行應用程序和服務。同時,斷開WIFI和藍牙服務,以避免在測試期間可能會影響設備的外部干擾。
利用Linux(Ubuntu 16.04 LTS)系統,實現對Android 8.0源代碼的修改和編譯。其客戶端使用Android 8.0源代碼結合Android Studio進行應用程序的開發,客戶端開發與測試環境如表1所示。移動端實驗設備為Pixel 2,其系統參數如表2所示,服務器端的開發環境如表3所示。

表1 客戶端開發與測試環境

表2 Pixel 2系統參數

表3 AOSP源碼編譯環境
3.2.2 測試方法
通過運行應用程序測量算法的速度,測試過程可以在代碼中加入簡單的測時語句來直接顯示出運行時間,循環1 000次求平均值,代碼如下。
long startTime=System.currentTimeMillis();
long endTime=System.currentTimeMillis();
Role role=new Role();
(public class Role { void role(){
for(int i=0;i<1000;i++){
int sum=0;
sum=sum+i; } )
Log.d(TAG,"(endTime-startTime)");
3.2.3 測試結果
將SM2/SM3/SM4密碼算法和Android系統中內置密碼算法的進行對比測試。Java語言實現的SM2/SM3/SM4密碼算法在Pixel 2上的測試結果如圖11所示。

圖11 Java語言實現的算法效能測試結果
為了提高該密碼算法在Android系統中的高效性,采用NDK技術,通過C語言實現的SM2/SM3/SM4密碼算法在Pixel 2的測試結果如圖12所示。

圖12 C語言實現的算法效能測試結果
對比圖11和圖12,可以得出C語言實現的算法速度比Java語言實現的速度快至少5倍。
因此,在滿足用戶對算法速度要求的基礎上,Android系統中引入SM2/SM3/SM4密碼算法,實現其密碼功能,提供良好的用戶體驗。其中,SM2公鑰加密算法是基于橢圓曲線算法ECC,使用橢圓曲線點定義密鑰對,即使黑客使用常用暴力破解,也難以進行攻擊,從而增強了算法的安全性,更有效地保護隱私數據。
從移動手機安全性出發,對Android安全機制進行研究和分析,在Android 8.0源碼中添加SM2/SM3/SM4密碼算法,通過開發應用程序實現其密碼功能,重新編譯Android 8.0源碼并定制ROM包實現刷機,使Android系統具備基于SM2/SM3/SM4密碼算法的安全能力。測試結果表明,引入中國國家密碼算法的Android系統能有效地保護用戶隱私和數據。