本發(fā)明主要涉及移動數(shù)據(jù)防泄漏領(lǐng)域,特別是一種基于預(yù)解密的移動終端透明加密方法。
背景技術(shù):
隨著移動終端設(shè)備功能日益強大,越來越多的企業(yè)員工已經(jīng)或即將擺脫辦公室的約束,通過移動終端設(shè)備來處理日常工作事務(wù)。然而,企業(yè)關(guān)鍵數(shù)據(jù)向移動終端設(shè)備延伸,使得移動終端數(shù)據(jù)泄漏成為企業(yè)面臨的一個新的問題,因此移動終端透明加密技術(shù)應(yīng)運而生。
所謂透明加密,是指在不改變用戶操作習(xí)慣的情況下完成文件的加密和解密過程。當(dāng)系統(tǒng)監(jiān)測到用戶對受保護的文件進行讀寫操作時,將對文件進行解密操作,將明文傳送給應(yīng)用程序。當(dāng)系統(tǒng)監(jiān)測到用戶對受保護的文件結(jié)束讀寫操作時,又將對文件進行加密操作,將密文傳送存儲設(shè)備進行存儲。整個過程與文件的所在環(huán)境密切相關(guān),環(huán)境一旦更改,加解密過程將無法完成,從而保證了對指定文件的保護。
為此,研究人員提出了兩種移動終端的數(shù)據(jù)透明加密技術(shù):基于文件系統(tǒng)的驅(qū)動加密技術(shù)和鉤子透明加密技術(shù)。基于文件系統(tǒng)的驅(qū)動加密技術(shù)工作在Android操作系統(tǒng)的內(nèi)核層,主要依賴于Linux的文件系統(tǒng)驅(qū)動技術(shù)。文件系統(tǒng)驅(qū)動是把文件作為一種設(shè)備來處理的一種虛擬驅(qū)動。當(dāng)文件系統(tǒng)驅(qū)動檢測到用戶對某種后綴文件進行操作時,對該文件進行加密/解密操作,從而達到加密的效果。而鉤子透明加密技術(shù)工作在移動終端應(yīng)用層,結(jié)合使用Android API函數(shù)和Hook消息處理機制。通過Java Hook的鉤子技術(shù),監(jiān)控應(yīng)用程序?qū)ξ募拇蜷_和保存。打開文件時,先對密文進行解密再讀入內(nèi)存,以保證應(yīng)用程序讀到的是明文。保存文件時,先將內(nèi)存中的明文進行加密再寫入到磁盤中。
然而,移動終端數(shù)據(jù)透明加密技術(shù)剛剛起步,兩種透明加密技術(shù)都存在一定的問題?;谖募到y(tǒng)的驅(qū)動加密技術(shù)工作性能不穩(wěn)定,且需要編譯用戶移動終端的系統(tǒng),通用性不強,不適用于企業(yè)數(shù)據(jù)防泄漏體系。鉤子透明加密技術(shù)通用性強,但相比驅(qū)動加密技術(shù),文件讀寫慢,性能較差。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于提供一種安全、高效的基于預(yù)解密的移動終端透明加密方法。
實現(xiàn)本發(fā)明目的的技術(shù)解決方案為:一種基于預(yù)解密的移動終端透明加密方法,針對移動終端數(shù)據(jù)加密的客戶端模型,透明加密過程涉及到的實體如下:強密文集合M={Mi},預(yù)解密臨時文件集合P={Pi}和明文集合N={Ni},文件集合F={Fi},i=1,2,3…,具體步驟如下:
(1)Xposed框架初始化:
初始化Xposed框架,加載文件系統(tǒng)Hook模塊;根據(jù)Xposed框架特性,實現(xiàn)在Android Runtime層的Hook功能調(diào)用,首先初始化Hook模塊功能,并設(shè)置輸入?yún)?shù)為文件變量Fi;
(2)文件標(biāo)識符遍歷:
遍歷文件標(biāo)識符,判斷Fi是否屬于強密文集M;提取Fi字節(jié)流,Hook模塊提取16位校驗符,判斷當(dāng)前變量Fi是否屬于強密文集合M,若否,則直接跳過Hook作用域,返回Fi字節(jié)流給上層應(yīng)用;若是,則提取16位權(quán)限標(biāo)識符并進行實時數(shù)字證書認證,若當(dāng)前終端不合法,則返回強密文狀態(tài)數(shù)據(jù)給用戶;若合法,則進入步驟(3);
(3)預(yù)解密臨時文件遍歷:
提取16位預(yù)解密偏移值,對當(dāng)前Fi字節(jié)流進行預(yù)解密文件驗證,若驗證不通過,不存在一次密文,則進入步驟(4);若驗證通過,則直接進入步驟(5);
(4)預(yù)解密臨時文件集更新:
若不存在一次密文,則對當(dāng)前緩存中的強密文Fi進行預(yù)解密,并生成相應(yīng)預(yù)解密臨時文件;
(5)二次解密預(yù)解密臨時文件子集:
若驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文Fi;然后,針對緩存中的一次密文進行二次解密;最終輸出明文到應(yīng)用層;
(6)明文子集二次強加密:
修改并存儲文檔時,首先,提取16位權(quán)限標(biāo)識符并進行實時數(shù)字證書認證,若當(dāng)前終端不合法,則無權(quán)修改數(shù)據(jù),直接返回原強密文;若合法,則對明文數(shù)據(jù)一次加密,并進行預(yù)解密文件更新;然后進行二次強加密,并將強密文存儲到終端內(nèi)存中。
進一步地,步驟(1)中所述初始化Xposed框架,加載文件系統(tǒng)Hook模塊;根據(jù)Xposed框架特性,實現(xiàn)在Android Runtime層的Hook功能調(diào)用,首先初始化Hook模塊功能,并設(shè)置輸入?yún)?shù)為文件變量Fi,具體如下:
1)通過覆蓋原生的/system/bin/app_process程序,對app_process進行擴展,控制zygote進程;
2)使app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持;
3)在Android系統(tǒng)啟動的時候,Zygote進程加載XposedBridge,將移動終端文件系統(tǒng)讀寫Method通過JNI方法HookMethodNative指向Native原生方法XposedCallHandler,此方法再轉(zhuǎn)入handleHookedMethod這個Java方法執(zhí)行用戶規(guī)定的移動終端文件系統(tǒng)Hook Function。
進一步地,步驟(3)所述預(yù)解密臨時文件遍歷的過程如下:
提取16位預(yù)解密偏移值,對當(dāng)前文檔進行預(yù)解密文件驗證,若驗證不通過,不存在一次密文,則對當(dāng)前緩存中的強密文進行預(yù)解密,并生成相應(yīng)預(yù)解密臨時文件;若驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文,具體過程如下:
預(yù)解密文件驗證:是否成立,其中pre_verification(i)是提取16位預(yù)解密偏移值的簽名;若成立,說明不存在一次密文,則對當(dāng)前緩存中的強密文進行預(yù)解密;否則,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文。
進一步地,步驟(5)中所述二次解密預(yù)解密臨時文件子集的過程如下:
預(yù)解密臨時文件遍歷驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文;然后,針對緩存中的一次密文進行二次解密;最終輸出明文到應(yīng)用層,具體過程如下:
二次解密:re_decrypt(Pi)→(i,N),Pi是已驗證存在預(yù)解密臨時文件的文件Fi字節(jié)流,通過二次解密生成明文字節(jié)流N提交應(yīng)用層。
本發(fā)明與現(xiàn)有技術(shù)相比,其顯著優(yōu)點為:(1)透明加密安全性:采用Xposed框架Hook技術(shù),通過覆蓋原生的/system/bin/app_process程序,對app_process進行擴展,控制zygote進程,使得規(guī)定的Hook Function在Android框架的RUNTIME層(Android系統(tǒng)第三層)得到執(zhí)行,解決了移動終端傳統(tǒng)透明加密技術(shù)只能保證應(yīng)用層安全的缺陷;(2)透明加密性能:采用二次解密的預(yù)解密透明加密方案,規(guī)避高性能損耗的解密操作,在合法移動終端上打開加密文件時,只進行簡單的二次解密,大大提高透明加密技術(shù)在移動終端上的性能。
附圖說明
圖1是本發(fā)明基于預(yù)解密的移動終端透明加密方法的流程圖。
圖2是本發(fā)明基于預(yù)解密的移動終端透明加密方法的系統(tǒng)模型圖。
具體實施方式
下面結(jié)合附圖及實施示例對本發(fā)明作進一步詳細描述。以下實施例在以本發(fā)明技術(shù)方案為前提下進行實施,給出了詳細的實施方式和過程,但本發(fā)明的保護范圍不限于下述的實施例。
結(jié)合圖1,本發(fā)明基于預(yù)解密的移動終端透明加密方法,針對移動終端數(shù)據(jù)加密的客戶端模型,透明加密過程涉及到的實體如下:強密文集合M={Mi},預(yù)解密臨時文件集合P={Pi}和明文集合N={Ni},文件集合F={Fi},i=1,2,3…,具體步驟如下:
(1)Xposed框架初始化:
初始化Xposed框架,加載文件系統(tǒng)Hook模塊;根據(jù)Xposed框架特性,實現(xiàn)在Android Runtime層的Hook功能調(diào)用,首先初始化Hook模塊功能,并設(shè)置輸入?yún)?shù)為文件變量Fi,具體如下:
1)通過覆蓋原生的/system/bin/app_process程序,對app_process進行擴展,控制zygote進程;
2)使app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持;
3)在Android系統(tǒng)啟動的時候,Zygote進程加載XposedBridge,將移動終端文件系統(tǒng)讀寫Method通過JNI方法HookMethodNative指向Native原生方法XposedCallHandler,此方法再轉(zhuǎn)入handleHookedMethod這個Java方法執(zhí)行用戶規(guī)定的移動終端文件系統(tǒng)Hook Function。
(2)文件標(biāo)識符遍歷:
遍歷文件標(biāo)識符,判斷Fi是否屬于強密文集M;提取Fi字節(jié)流,Hook模塊提取16位校驗符,判斷當(dāng)前變量Fi是否屬于強密文集合M,若否,則直接跳過Hook作用域,返回Fi字節(jié)流給上層應(yīng)用;若是,則提取16位權(quán)限標(biāo)識符并進行實時數(shù)字證書認證,若當(dāng)前終端不合法,則返回強密文狀態(tài)數(shù)據(jù)給用戶;若合法,則進入步驟(3)。
(3)預(yù)解密臨時文件遍歷:
提取16位預(yù)解密偏移值,對當(dāng)前Fi字節(jié)流進行預(yù)解密文件驗證,若驗證不通過,不存在一次密文,則進入步驟(4);若驗證通過,則直接進入步驟(5);
所述預(yù)解密臨時文件遍歷的過程如下:
提取16位預(yù)解密偏移值,對當(dāng)前文檔進行預(yù)解密文件驗證,若驗證不通過,不存在一次密文,則對當(dāng)前緩存中的強密文進行預(yù)解密,并生成相應(yīng)預(yù)解密臨時文件;若驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文,具體過程如下:
預(yù)解密文件驗證:是否成立,其中pre_verification(i)是提取16位預(yù)解密偏移值的簽名;若成立,說明不存在一次密文,則對當(dāng)前緩存中的強密文進行預(yù)解密;否則,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文。
(4)預(yù)解密臨時文件集更新:
若不存在一次密文,則對當(dāng)前緩存中的強密文Fi進行預(yù)解密,并生成相應(yīng)預(yù)解密臨時文件。
(5)二次解密預(yù)解密臨時文件子集:
若驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文Fi;然后,針對緩存中的一次密文進行二次解密;最終輸出明文到應(yīng)用層;
所述二次解密預(yù)解密臨時文件子集的過程如下:
預(yù)解密臨時文件遍歷驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文;然后,針對緩存中的一次密文進行二次解密;最終輸出明文到應(yīng)用層,具體過程如下:
二次解密:re_decrypt(Pi)→(i,N),Pi是已驗證存在預(yù)解密臨時文件的文件Fi字節(jié)流,通過二次解密生成明文字節(jié)流N提交應(yīng)用層。
(6)明文子集二次強加密:
修改并存儲文檔時,首先,提取16位權(quán)限標(biāo)識符并進行實時數(shù)字證書認證,若當(dāng)前終端不合法,則無權(quán)修改數(shù)據(jù),直接返回原強密文;若合法,則對明文數(shù)據(jù)一次加密,并進行預(yù)解密文件更新;然后進行二次強加密,并將強密文存儲到終端內(nèi)存中。
實施例1
為了更好地理解本發(fā)明提出的方法,選取一次移動辦公環(huán)境下對企業(yè)機密數(shù)據(jù)的透明加解密事件。
本實施例執(zhí)行流程如圖1所示,針對移動終端數(shù)據(jù)加密的客戶端模型,透明加密過程涉及到的實體如下:強密文集合M={Mi},預(yù)解密臨時文件集合P={Pi}和明文集合N={Ni},文件集合F={Fi},i=1,2,3…,具體步驟如下:
步驟101:初始化xposed框架,加載文件系統(tǒng)hook模塊。具體過程如下:
1)通過覆蓋原生的/system/bin/app_process程序,對app_process進行擴展,控制zygote進程。
2)使app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持。
3)在Android系統(tǒng)啟動的時候,Zygote進程加載XposedBridge,將移動終端文件系統(tǒng)讀寫Method通過JNI方法HookMethodNative指向Native原生方法XposedCallHandler,此方法再轉(zhuǎn)入handleHookedMethod這個Java方法執(zhí)行用戶規(guī)定的移動終端文件系統(tǒng)Hook Function。
步驟102:遍歷文件標(biāo)識符,判斷Fi是否屬于強密文子集。具體過程如下:
1)遍歷文件標(biāo)識符,判斷Fi是否屬于強密文集M。提取Fi字節(jié)流,Hook模塊提取16位校驗符,判斷當(dāng)前變量Fi是否屬于強密文集合M。
2)若當(dāng)前變量Fi不屬于強密文集合M,則直接跳過Hook作用域,返回Fi字節(jié)流給上層應(yīng)用。
3)若當(dāng)前變量Fi屬于強密文集合M,則提取16位權(quán)限標(biāo)識符并進行實時數(shù)字證書認證,
4)若當(dāng)前終端數(shù)字證書認證不合法,則返回強密文狀態(tài)數(shù)據(jù)給用戶。
5)若當(dāng)前終端數(shù)字證書認證合法,則進入步驟103。
步驟103:遍歷預(yù)解密臨時文件集P,判斷強密文是否屬于P。具體過程如下:
1)判斷預(yù)解密文件驗證:是否成立,其中pre_verification(i)是提取16位預(yù)解密偏移值的簽名。
2)若條件成立,說明不存在一次密文,則對當(dāng)前緩存中的強密文進行預(yù)解密;
3)若條件不成立,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文。
步驟104:預(yù)解密子集Fi并實時更新預(yù)解密臨時文件集P。具體過程如下:
對當(dāng)前緩存中的強密文進行預(yù)解密,并生成相應(yīng)預(yù)解密臨時文件。將一次解密的弱密文重新提交文件系統(tǒng)緩存區(qū)。
步驟105:二次解密預(yù)解密臨時文件子集,并生成明文對象賦值對象Fi,更新明文集N。具體過程如下:
預(yù)解密臨時文件遍歷驗證通過,存在相應(yīng)一次密文,則提取預(yù)解密文件并替換緩存中的強密文;然后,針對緩存中的一次密文進行二次解密;最終輸出明文到應(yīng)用層。對于re_decrypt(Pi)→(i,N),其中Pi是已驗證存在預(yù)解密臨時文件的文件Fi字節(jié)流,通過二次解密生成明文字節(jié)流N提交應(yīng)用層。
上述方法的系統(tǒng)模型如圖2所示,包含三類實體:云服務(wù)器、合法移動終端和非法移動終端。當(dāng)服務(wù)器需要下發(fā)關(guān)鍵數(shù)據(jù)時,云服務(wù)器與合法移動終端建立數(shù)據(jù)連接并進行數(shù)據(jù)通信。同時,服務(wù)器定時向合法移動終端下發(fā)權(quán)限管控指令,以完成透明加解密權(quán)限認證。合法客戶端接收到服務(wù)器指令的同時,實時向云服務(wù)器反饋日志文件,將客戶端行為記錄上傳到云服務(wù)器備份。同時,非法客戶端企圖與云服務(wù)器簡歷偽連接的行為將被身份驗證后拒絕,同時云服務(wù)器在數(shù)據(jù)傳輸途中處于強加密狀態(tài),非法客戶端無法竊聽關(guān)鍵數(shù)據(jù)。
本發(fā)明利用預(yù)解密的思想構(gòu)造了一個更加安全高效的移動終端透明加密方案,利用基于Xposed框架Hook技術(shù)完成文件系統(tǒng)透明加解密功能,實現(xiàn)了移動終端透明加密技術(shù)中間層的安全級別,有效解決了移動終端傳統(tǒng)透明加密技術(shù)只能保證應(yīng)用層安全的缺陷。同時,通過引入預(yù)解密零時文件集的概念,實現(xiàn)了對移動終端辦公數(shù)據(jù)的二次強加密,提升了透明加密性能,節(jié)約了文件系統(tǒng)操作過程的開銷。本發(fā)明能夠同時實現(xiàn)移動終端透明加密技術(shù)性能和安全性的提升。