王春蘭 康鵬程
摘? 要:各種智能設(shè)備的信息常用Sqlite數(shù)據(jù)庫儲(chǔ)存,這些信息可能會(huì)因?yàn)楦鞣N原因“丟失”。介紹了Sqlite數(shù)據(jù)庫基本情況,總結(jié)了傳統(tǒng)的可靠性高的Sqlite數(shù)據(jù)恢復(fù)方法并指出不足之處,然后對(duì)兩種新型數(shù)據(jù)恢復(fù)方法——以Sqlite存儲(chǔ)結(jié)構(gòu)為基礎(chǔ)的數(shù)據(jù)恢復(fù)技術(shù)和以Sqlite預(yù)寫日志為基礎(chǔ)的數(shù)據(jù)恢復(fù)技術(shù)進(jìn)行了闡述。
關(guān)鍵詞:Sqlite數(shù)據(jù)庫;數(shù)據(jù)恢復(fù);數(shù)據(jù)存儲(chǔ);日志
中圖分類號(hào):TP309.3文獻(xiàn)標(biāo)志碼:A 文章編號(hào):2095-2945(2019)32-0160-03
Abstract: Sqlite databases are commonly used to store information on various smart devices, which may be "lost" for various reasons. This paper introduces the basic situation of Sqlite database, summarizes the traditional high reliability Sqlite data recovery methods and points out the shortcomings. Then is describes two new data recovery methods, data recovery technology based on Sqlite storage structure and data recovery technology based on Sqlite prewrite log.
Keywords: Sqlite database; data recovery; data storage; log
1 概述
Android手機(jī)以其開放、適應(yīng)性強(qiáng)的優(yōu)勢(shì),已經(jīng)占了市場(chǎng)八成份額[1]。用戶與Android設(shè)備二十四小時(shí)“親密無
間”,用戶的大量信息留在手機(jī)中。這些數(shù)據(jù)在偶然或者人為因素下數(shù)據(jù)可能“丟失”,對(duì)大量用戶而言,需要安全高效的數(shù)據(jù)恢復(fù)技術(shù)找回?cái)?shù)據(jù);在電子取證過程中,嫌疑人持有的智能設(shè)備中可能存儲(chǔ)有相關(guān)證據(jù),可能被嫌疑人“刪除”,需要恢復(fù)數(shù)據(jù),打擊犯罪。Android系統(tǒng)廣泛地使用Sqlite數(shù)據(jù)庫,其特點(diǎn)是輕量、快速、運(yùn)行流暢[2]。目前有一些安卓手機(jī)Sqlite數(shù)據(jù)庫恢復(fù)方法,但面對(duì)不同品牌不同設(shè)備、甚至不同型時(shí)效果不盡如人意,恢復(fù)效率也不高。
2 Sqlite數(shù)據(jù)庫
Android使用開源的、與操作系統(tǒng)無關(guān)的SQL數(shù)據(jù)庫——SQLite。Sqlite數(shù)據(jù)庫為了簡(jiǎn)化操作,將Sqlite數(shù)據(jù)庫集成到設(shè)備的操作中,并且封裝用于操作數(shù)據(jù)庫的API,以便快速操作數(shù)據(jù)庫[3,4]。因此,不同的用戶數(shù)據(jù)將會(huì)被各自APP管理,數(shù)據(jù)被創(chuàng)建并保存在各自應(yīng)用對(duì)應(yīng)的Sqlite數(shù)據(jù)庫目錄下,這些被記載的信息,其實(shí)是安卓手機(jī)Sqlite數(shù)據(jù)恢復(fù)的來源。提取和恢復(fù)數(shù)據(jù)庫信息,就是傳統(tǒng)數(shù)據(jù)恢復(fù)技術(shù)的核心步驟。
2.1 Sqlite日志恢復(fù)技術(shù)
Sqlite日志恢復(fù)措施是基于該庫的日志存放機(jī)制[5]。首先確保日志文件沒有缺失,數(shù)據(jù)才能被恢復(fù)。在系統(tǒng)異常崩潰,或者突然斷電時(shí),日志文件會(huì)無法正常保存。這種方法以往主要用于計(jì)算機(jī)取證,在Android設(shè)備數(shù)據(jù)恢復(fù)技術(shù)中用得比較少,但在安卓手機(jī)信息恢復(fù)中也是一種可以嘗試的方法。
2.2 Sqlite自由塊恢復(fù)技術(shù)
Sqlite數(shù)據(jù)庫自由塊恢復(fù)措施,首先要發(fā)現(xiàn)索引中提供的各種數(shù)據(jù),它們存在于Sqlite的內(nèi)部頁面;然后掃描并發(fā)現(xiàn)存在的數(shù)據(jù)頁。接著提取存儲(chǔ)在數(shù)據(jù)頁面的空閑塊數(shù)據(jù)信息,最后根據(jù)所要恢復(fù)的數(shù)據(jù)特征找到數(shù)據(jù)并進(jìn)行Sqlite數(shù)據(jù)恢復(fù)[6]。這種方法有一定的局限,當(dāng)數(shù)據(jù)庫文件不夠完整,或者內(nèi)部頁面索引數(shù)據(jù)不全時(shí),都無法順利定位和恢復(fù)數(shù)據(jù)。
可見Sqlite數(shù)據(jù)庫的兩種傳統(tǒng)恢復(fù)措施都存在一些缺點(diǎn),不足以應(yīng)對(duì)Sqlite數(shù)據(jù)庫恢復(fù)的需求。兩個(gè)比較完備的恢復(fù)技術(shù)應(yīng)運(yùn)而生,新型恢復(fù)技術(shù)根據(jù)Sqlite數(shù)據(jù)庫本身特點(diǎn),根據(jù)存儲(chǔ)結(jié)構(gòu)和預(yù)寫日志展開。
3 新型Sqlite數(shù)據(jù)庫數(shù)據(jù)恢復(fù)技術(shù)
3.1 以Sqlite存儲(chǔ)結(jié)構(gòu)為基礎(chǔ)的數(shù)據(jù)恢復(fù)技術(shù)
Sqlite數(shù)據(jù)庫的后端由B-tree、Pager和OS Interface組成。B-tree的職責(zé)是負(fù)責(zé)排序,維護(hù)多個(gè)數(shù)據(jù)庫頁之間錯(cuò)綜復(fù)雜的關(guān)系,將頁面組織成樹狀結(jié)構(gòu),頁面就是樹的葉子。Pager負(fù)責(zé)傳輸,根據(jù)B-tree的請(qǐng)求從磁盤讀取頁面或者寫入頁面。
在Sqlite數(shù)據(jù)庫操作時(shí),不完全擦除原有數(shù)據(jù),安卓手機(jī)中刪除的數(shù)據(jù)庫文件也可以存儲(chǔ)在某些文件中[7]。因此,對(duì)于Sqlite存儲(chǔ)的結(jié)構(gòu)復(fù)原措施,順序掃描文件可能存在的空間,然后挖掘和獲取數(shù)據(jù)。首先得到數(shù)據(jù)分區(qū)的鏡像,接著定位有效的數(shù)據(jù)頁,然后寫入恢復(fù)后的數(shù)據(jù)庫數(shù)據(jù),這一步依賴于數(shù)據(jù)頁記錄;最后,重復(fù)的記錄被丟棄,得到最終的信息。
安卓設(shè)備信息存儲(chǔ)于邏輯分區(qū)的數(shù)據(jù)區(qū)域,這是公共存儲(chǔ)路徑[8]。得到數(shù)據(jù)分區(qū)鏡像是數(shù)據(jù)恢復(fù)的前提,可以把該分區(qū)復(fù)制到內(nèi)存卡,或者直接復(fù)制到目標(biāo)地址。每個(gè)app都有一個(gè)特殊的數(shù)據(jù)庫目錄,本步驟最終要獲取的是Sqlite數(shù)據(jù)庫[9]。一旦數(shù)據(jù)被覆蓋丟失,原來記錄存儲(chǔ)單元單位有3個(gè)不同的情形。第一種是記錄在該單元是完整的;第二種是記錄在該單元完整且有多個(gè);第三種是記錄在該單位不完整。能恢復(fù)的只有第一種和第二種情況,最后一種沒有有效通過軟件的方法去恢復(fù),可以嘗試物理方法解決。在Sqlite數(shù)據(jù)庫,數(shù)據(jù)頁面的大小空間通常為1024B或4096B,設(shè)備的最小存儲(chǔ)單元必然大于4096B;對(duì)應(yīng)于文件系統(tǒng),也因?yàn)閿?shù)據(jù)頁面使用逐頁存儲(chǔ)機(jī)制,在安卓手機(jī)中存儲(chǔ)所謂的“丟失的文件”,數(shù)據(jù)頁信息是不會(huì)丟失的,這對(duì)信息的恢復(fù)很有幫助。
對(duì)于該恢復(fù)方法,最重要的三個(gè)部分分別是:找到B-tree頁面,發(fā)現(xiàn)記錄位置,然后恢復(fù)記錄。例如,在 B-tree頁的定位中,B-tree頁面定位算法的使命是在得到的映像中發(fā)現(xiàn)數(shù)據(jù)和內(nèi)部頁面,便以提取頁面中的信息。
3.2 以Sqlite預(yù)寫日志為基礎(chǔ)的數(shù)據(jù)恢復(fù)技術(shù)
SQLite在3.7.0版本引入了WAL(Write-Ahead-Logging),WAL的全稱是Write Ahead Logging,它是很多數(shù)據(jù)庫中用于實(shí)現(xiàn)原子事務(wù)的一種機(jī)制。采用WAL機(jī)制后,對(duì)數(shù)據(jù)庫的修改并不直接寫入到數(shù)據(jù)庫文件中,而是寫入到另外一個(gè)稱為WAL的文件中;如果事務(wù)失敗,WAL中的記錄會(huì)被忽略,撤銷修改;如果事務(wù)成功,它將在隨后的某個(gè)時(shí)間被寫回到數(shù)據(jù)庫文件中,提交修改。讀操作時(shí),SQLite將在WAL文件中搜索,找到最后一個(gè)寫入點(diǎn),記住它,并忽略在此之后的寫入點(diǎn)(這保證了讀寫和讀讀可以并行執(zhí)行);隨后,它確定所要讀的數(shù)據(jù)所在頁是否在WAL文件中,如果在,則讀WAL文件中的數(shù)據(jù),如果不在,則直接讀數(shù)據(jù)庫文件中的數(shù)據(jù)。寫操作時(shí),SQLite將之寫入到WAL文件中即可,但是必須保證獨(dú)占寫入,因此寫寫之間不能并行執(zhí)行。
這種數(shù)據(jù)恢復(fù)方法同樣需要獲取手機(jī)的鏡像。Android手機(jī)在執(zhí)行Sqlite數(shù)據(jù)更新操作時(shí),會(huì)提前將相關(guān)信息寫入日志文件。在進(jìn)行數(shù)據(jù)恢復(fù)時(shí),首先掃描鏡像,找到要恢復(fù)的數(shù)據(jù)庫的日志文件,根據(jù)日志文件掃描數(shù)據(jù)庫的數(shù)據(jù)幀塊,最后將找到的數(shù)據(jù)塊按照對(duì)應(yīng)順序合理連接,實(shí)現(xiàn)數(shù)據(jù)庫的恢復(fù)目的[10]。每一次操作的具體步驟是相似的,原理都是基于Sqlite的存儲(chǔ)結(jié)構(gòu),開始獲取數(shù)據(jù)分區(qū)的數(shù)據(jù);接著定位有效的且連接在一起的有效幀塊;其次,根據(jù)具體情況寫入恢復(fù)數(shù)據(jù)庫中的數(shù)據(jù)頁記錄;最后,判斷是否已經(jīng)存在同樣的記錄,如果有重復(fù)的記錄則丟棄,掃描完所有的數(shù)據(jù)塊后得到最終的完整信息。
該方法中,最重要的有四個(gè)步驟:框架信息的定位和連接,記錄信息的提取和恢復(fù)。具體步驟如圖1所示。
對(duì)于該數(shù)據(jù)庫預(yù)寫日志的措施,有必要在做好數(shù)據(jù)恢復(fù)前,了解數(shù)據(jù)的碎片化現(xiàn)象。但是記錄數(shù)據(jù)在碎片化之后,如果要恢復(fù)數(shù)據(jù),其恢復(fù)過程需要過多的時(shí)間。如果直接連接所獲得的數(shù)據(jù)幀塊,則可以確保記錄數(shù)據(jù)不會(huì)有丟失,并且能夠提高還原后的效果。必須確定隨機(jī)數(shù)和連接幀塊,才能成功連接數(shù)據(jù)幀塊。比如:根據(jù)幻數(shù)掃描映像,然后找到日志文件。然后,搜索幀并提取記錄就要根據(jù)隨機(jī)數(shù)的大小,確定其是否包含于目標(biāo)數(shù)據(jù)文件。再依照隨機(jī)數(shù)來繼續(xù)搜索,拿到所有數(shù)據(jù)塊;最后一步,逐一單獨(dú)計(jì)算得到數(shù)據(jù)塊連接空間的具體值,以值進(jìn)行幀塊的連接。
在預(yù)寫日志中根據(jù)給定目標(biāo)恢復(fù)記錄,然后為下一個(gè)數(shù)據(jù)幀塊獲取和連接工作確定隨機(jī)數(shù),就要用到確定隨機(jī)數(shù)算法。預(yù)寫日志的定位又要用到幻數(shù),加以確認(rèn),得到臨時(shí)隨機(jī)數(shù)值;接著,根據(jù)臨時(shí)隨機(jī)數(shù)的值定位預(yù)寫文件日志記錄,并確定所有目標(biāo)幀塊;最后,提取幀塊中的第一個(gè)所需目標(biāo)記錄,當(dāng)然,這不會(huì)完全正確提取,則需要判斷確定恢復(fù)的記錄,然后確定該隨機(jī)數(shù)。至于數(shù)據(jù)幀塊拼接算法,它主要通過確定的隨機(jī)數(shù),再定位幀塊,最終完成目標(biāo)幀塊拼接。幀塊由隨機(jī)數(shù)定位,初始偏移量會(huì)根據(jù)公式計(jì)算,得到的提取幀塊的數(shù)據(jù),在下一次記錄恢復(fù)可以用到,依次執(zhí)行取得所有目標(biāo)幀塊。在計(jì)算過程中,需要用到隨機(jī)數(shù)定位的幀塊的偏移大小和BLOCK_SIZE表示文件系統(tǒng)的分配大小。
4 結(jié)論
與傳統(tǒng)的數(shù)據(jù)恢復(fù)技術(shù)相比,新型恢復(fù)方法的亮點(diǎn)在于充分利用數(shù)據(jù)結(jié)構(gòu)和存儲(chǔ)日志,以達(dá)到Sqlite數(shù)據(jù)庫恢復(fù)的目標(biāo)。新型的數(shù)據(jù)恢復(fù)算法對(duì)Android手機(jī)的Sqlite數(shù)據(jù)庫數(shù)據(jù)信息恢復(fù)技術(shù)具有指導(dǎo)意義,可以大概率成功完成數(shù)據(jù)丟失后的恢復(fù)工作。
參考文獻(xiàn):
[1]畢攀.基于紅黑樹的嵌入式數(shù)據(jù)庫Sqlite索引機(jī)制的優(yōu)化方案的研究[D].太原科技大學(xué),2012.
[2]李蔚.基于閃存數(shù)據(jù)庫系統(tǒng)的存儲(chǔ)管理技術(shù)研究[D].華中科技大學(xué),2009.
[3]楊有波.基于μC/OS-Ⅲ操作系統(tǒng)的Sqlite數(shù)據(jù)庫的移植與分析[D].河北工業(yè)大學(xué),2014.
[4]劉婕.基于Android系統(tǒng)的移動(dòng)終端通訊錄的研究與設(shè)計(jì)[D].西安電子科技大學(xué),2013.
[5]課家教育.詳細(xì)談?wù)凙ndroid系統(tǒng)中的Sqlite數(shù)據(jù)庫的應(yīng)用[EB/OL].北京.[2016-04-08].http://www.kokojia.com/article/17544.html.
[6]董婷婷.基于Android系統(tǒng)的手機(jī)隱私數(shù)據(jù)的加密研究[D].安徽理工大學(xué),2017.
[7]DragonWar.Sqlite預(yù)寫式日志[EB/OL].北京.[2014-12-03].https://blog.csdn.net/weixin_33748818/article/details/85676411.
[8]李蔚.基于閃存數(shù)據(jù)庫系統(tǒng)的存儲(chǔ)管理技術(shù)研究[D].華中科技大學(xué),2009.
[9]王付華,王永杰.iPhone平臺(tái)Sqlite數(shù)據(jù)庫開發(fā)[J].電腦編程技巧與維護(hù),2014(13):25-28.
[10]陳浩.Android手機(jī)的Sqlite數(shù)據(jù)恢復(fù)技術(shù)研究[D].杭州電子科技大學(xué),2016.