spatialite android,一种基于Android系统的Spatialite空间数据库加密方法与流程
本發明屬于數據庫技術領域,具體涉及一種基于Android系統的Spatialite空間數據庫加密方法。
背景技術:
隨著經濟建設及智能終端和移動GIS技術的不斷發展,終端的CPU、GPU、內存、顯示屏、攝像頭、移動GPS芯片、存儲等硬件性能及集成化越來越高,很多開源數據庫和GIS軟件都支持移動端應用。Spatialite是基于SQLite開源數據庫引擎擴展而成的一個簡單、實用的輕量級空間數據庫,遵守ACID(Atomicity-原子性、Consistency-一致性、Isolation-隔離性、Durability-持久性)關系數據庫管理系統特性和OGC標準,支持跨平臺空間數據操作,通過Geometry類型字段能方便有效地組織管理點、線、面等各種類型的空間數據,為移動端的屬性數據、空間數據的一體化管理與應用提供了一種非常好的解決方案,Spatialite提供了AsText、GeomFromText、Intersects、Relate、Distance、Covers、Overlaps、Gunion等空間操作和分析函數,已廣泛應用于地理國情調查、國土資源執法監察、林業調查等行業。
基于GIS數據建立的各類應用系統,其數據具有敏感性、重要性,而移動終端在帶來便攜的同時,移動端數據具有易丟失、易受攻擊等安全問題。同時,攻擊者可能會利用操作系統或數據庫漏洞,或物理接觸移動終端和數據庫系統文件,從而可能繞過身份認證和存取控制而直接竊取或篡改數據庫內容。因此,移動終端應用系統的數據安全顯得尤為重要和突出,對數據庫及其數據進行加密是防范攻擊威脅的有效手段,必須在確保數據安全和保護的條件下才能廣泛開展各類應用。目前,移動終端應用系統的數據安全主要依靠數據加解密方法實現,主要有兩種方式:一是對數據庫里的數據內容加密;二是利用數據庫是獨立文件的特性對整個數據庫文件進行加密。上述兩種方式存在以下問題:
(1)方式一加密后的數據不能直接進行數據查詢、分析和統計,要實現數據查詢、分析、統計等功能,必須先對數據內容進行解密或轉換;
(2)方式二的資源占用率高,一是在建立數據庫連接時,必須對加密數據庫文件先進行解密,解密數據庫的過程是CPU占用率高的過程;二是解密數據庫需占用數據庫文件相當的存儲空間,對移動端的存儲容量有較高要求;三是在關閉數據庫時,為保障數據安全,必須刪除解密后的數據庫;四是在打開數據庫后、關閉數據庫前的數據庫應用過程中,非授權用戶完全可以通過復制、竊取等非法手段獲得解密后的數據庫,存在非常大的安全隱患;五是資源占用率與數據庫文件大小呈強正相關關系,即數據庫中的數據量越大資源占用率越高、使用效果就越差。
現階段,尚無專門針對Spatialite空間數據庫實現加密解密的API接口,現有研究主要集中在SQLite的數據庫加密功能的研究和應用。
技術實現要素:
針對現有技術中的上述不足,本發明公開了一種接口使用簡單、資源占用率低的基于Android系統的Spatialite空間數據庫加密方法,解決了現有技術中的不能直接對加密后的Sqlite空間數據庫進行數據查詢、分析和統計等常用操作的問題,并且解決了加密后的Sqlite空間數據庫使用復雜和資源占用率高的問題;廣泛應用于自然資源調查、地理國情調查、國土資源執法監察和林業調查等行業。
為了達到上述發明目的,本發明采用的技術方案為:
一種基于Android系統的Spatialite空間數據庫加密方法,包括如下步驟:
S1:搭建NDK編譯環境,即搭建安裝Spatialite空間數據庫所需的NDK編譯環境;
S2:下載資源及代碼,即下載安裝Spatialite空間數據庫編譯所需的資源及代碼;
S3:確定加密模型,即確定對Spatialite空間數據庫進行加密的模型;
S4:選擇加密算法,即根據步驟S3確定的加密模型,選擇對Spatialite空間數據庫進行加密的算法;
S5:管理密鑰及密鑰,即將用戶輸入的明文密碼通過變換,用于加密操作。
S6:實現加密,即利用Spatialite空間數據庫提供的預留接口,并采用步驟S3確定的加密模型和步驟S4選擇的加密算法,用標準C語言編寫源代碼實現數據庫文件的加密;
S7:編譯及生成庫文件,即在NDK編譯環境下輸入命令進行編譯,并生成Android系統運行所需的庫文件;
S8:接口調用與應用,即在Android開發環境中,導入步驟S7得到的庫文件,調用接口實現對數據庫進行操作。
本方案的有益效果為:
本發明為了解決Spatialite空間數據庫的數據安全問題,在現有開源Spatialite空間數據庫基礎上,擴展其接口,在不影響現有接口和功能模塊前提下提供Spatialite空間數據庫加密方法,能夠直接進行數據查詢、分析和統計,經編譯生成Android系統運行所需的庫文件,實現Android設備的數據庫文件底層加密,解決了現有技術中的接口使用復雜、資源占用率高等問題。
進一步地,步驟S1中搭建NDK編譯環境,包括如下步驟:
S1-1:下載并安裝模擬環境工具,同時配置NDK環境變量,用于編譯命令調用;
S1-2:下載Android-NDK壓縮包,解壓、命名并配置系統環境變量;
S1-3:測試NDK編譯環境是否正常,若正常進入步驟S2,否則進入步驟S1-1。
進一步地,步驟S2中資源及代碼下載,包括如下步驟:
S2-1:下載Spatialite源代碼,即下載Spatialite-Android,下載完成且解壓至D盤根目錄;
S2-2:下載編譯Spatialite空間數據庫所需資源。
進一步地,步驟S2-2中所需數據庫包括geos庫、proj庫、Sqlite庫和libspatialite庫。
進一步地,步驟S4中,選擇密碼學中的AES高級加密標準的候選算法,即Rijndael加密算法。
上述進一步方案的有益效果為:
Rijndael加密算法加密速度快、效率高、計算量小、復雜度低和安全性好,其使用的密鑰和區塊長度是32位的整數倍(以128位為下限,256位為上限),比標準的AES算法支持更大范圍的區塊和密鑰長度,既滿足數據庫加密需求,也保障了數據安全而很難被攻擊者破壞。
進一步地,步驟S7中編譯及生成庫文件,包括如下步驟:
S7-1:配置下載文件;
S7-2:配置編譯環境變量;
S7-3:運行步驟S1安裝的環境模擬工具,輸入命令進行編譯,生成Android系統運行所需的庫文件。
進一步地,步驟S8中對數據庫進行的操作包括數據建庫、加密訪問和存儲數據。
進一步地,步驟S8中接口調用與應用,包括如下步驟:
S8-1:對未加密數據庫進行加密,打開數據庫,調用rekey函數設置數據庫口令,關閉數據庫;
S8-2:對加密數據庫進行讀取和操作,打開數據庫,調用key函數輸入數據庫口令,讀取加密數據庫,輸入命令對數據庫進行操作,關閉數據庫。
附圖說明
圖1為一種基于Android系統的Spatialite空間數據庫加密方法流程圖;
圖2為搭建NDK編譯環境方法流程圖;
圖3為下載資源及代碼方法流程圖;
圖4為編譯及生成庫文件方法流程圖;
圖5為接口調用與應用方法流程圖。
具體實施方式
下面對本發明的具體實施方式進行描述,以便于本技術領域的技術人員理解本發明,但應該清楚,本發明不限于具體實施方式的范圍,對本技術領域的普通技術人員來講,只要各種變化在所附的權利要求限定和確定的本發明的精神和范圍內,這些變化是顯而易見的,一切利用本發明構思的發明創造均在保護之列。
本發明實施例中,如圖1所示,一種基于Android系統的Spatialite空間數據庫加密方法,包括如下步驟:
S1:搭建NDK編譯環境,即搭建安裝Spatialite空間數據庫所需的NDK編譯環境,由于Spatialite是C/C++的native語言編寫,而Android默認開發語言是Java,在Windows上編譯Spatialite必須用到NDK(Native Development Kit)環境;
搭建NDK編譯環境,如圖2所示,包括如下步驟:
S1-1:下載安裝Cygwin,模擬Linux環境工具,同時配置NDK環境變量,方便ndk-build編譯命令調用,;
S1-2:下載NDK壓縮包,解壓并命名,存放路徑不能包含空格,文件名及文件夾名不能過長;
S1-3:測試NDK編譯環境是否正常,若正常進入步驟S2,否則進入步驟S1-1;
S2:下載資源及代碼,即下載安裝Spatialite空間數據庫編譯所需的資源及代碼,Spatialite是基于完全開源的Sqlite作的空間擴展,實現Spatialite空間數據加密,須下載下列資源;
下載資源及代碼,如圖3所示,包括如下步驟:
S2-1:下載Spatialite源代碼,即下載Spatialite-Android,下載完成且解壓后找到spatialite-android-library并將其移至D盤根目錄;
S2-2:下載geos庫、proj庫、Sqlite庫和libspatialite庫;
S3:確定加密模型,即確定對Spatialite空間數據庫進行加密的模型,Spatialite加密模型具備數據及信息加密功能,且時間、空間的開銷小,在數據物理存取之前完成加/解密;
S4:選擇加密算法,即根據步驟S3確定的加密模型,選擇對Spatialite空間數據庫進行加密的算法,選取了密碼學中加密速度快、效率高、計算量小、復雜度低和安全性好的高級加密標準的候選算法,即Rijndael加密算法,既滿足數據庫加密需求,也保障了數據安全而很難被攻擊者破壞;
S5:管理密鑰及密鑰,即將用戶輸入的明文密碼通過變換,用于加密操作;對用戶設定的長度不固定且不能作為密鑰的口令進行變換處理,即利用變換函數CodecGenerateReadKey(Codec*codec,char*userPassword,int passwordLength)對輸入的口令進行變換,將其變換后的結果作為密鑰來對數據庫進行加密;
S6:實現加密,利用Spatialite空間數據庫提供的預留接口sqlite3_key()、sqlite3_rekey()和sqlite3CodecAttach()加密API接口,采用步驟S3確定的加密模型和步驟S4選擇的加密算法,用標準C語言編寫源代碼實現數據庫文件的加密;函數sqlite3_key()用于指定數據庫所使用的口令或密鑰,加密后數據庫通過本函數實現數據的正常存取;函數sqlite3_rekey()用于為數據庫重新設定口令或密鑰,是實現數據庫加密、更新密碼或清除密碼的函數;函數sqlite3CodecAttach()負責將密鑰(如果輸入的是口令則需利用步驟S5給出的方法和函數將口令轉換為密鑰)及頁面編碼函數與數據庫進行關聯,是數據庫實現加密、解密的核心函數;
S7:編譯及生成庫文件,即輸入ndk-build-j8命令進行編譯,并生成Android系統運行所需的so庫文件;
編譯及生成庫文件,如圖4所示,包括如下步驟:
S7-1:配置下載文件,找到步驟2中下載的Spatialite源代碼解壓后spatialite-android-library目錄中的jni子目錄,將步驟2下載的libspatialite庫、geos庫、proj庫、Sqlite庫全部解壓至jni子目錄中;將步驟S5和步驟S6編寫的對應源代碼復制到jni子目錄下Sqlite庫解壓后的文件夾中;
S7-2:配置編譯環境變量,因對Sqlite進行了功能擴展實現了Spaialite數據庫加密,Sqlite編譯時更改默認的LOCAL_SRC_FILES參數,以及在sqlite.c文件中首位置添加#define SQLITE_HAS_CODEC配置,用于標識或開啟Spaialite數據庫加密功能;
S7-3:運行步驟S1安裝好的Linux環境模擬工具Cygwin,輸入ndk-build-j8命令進行編譯,生成Android系統運行所需的庫文件,即libjsqlite.so庫文件;
S8:接口調用與應用,即在Android開發環境中,導入步驟S7得到的庫文件,調用接口實現對數據庫進行數據建庫、加密訪問和存儲數據的操作;
接口調用與應用,如圖4所示,包括如下步驟:
S8-1:對未加密數據庫進行加密,打開數據庫,調用rekey函數設置數據庫口令,關閉數據庫;
(設置未加密數據庫口令):
//加密數據庫:
S8-2:對加密數據庫進行讀取和操作,打開數據庫,調用key函數輸入數據庫口令,讀取加密數據庫,輸入命令對數據庫進行操作,關閉數據庫。
(讀取加密數據庫并實現數據的存取):
//打開數據庫和解密:
本發明在開源的Spatialite框架下,整合了一種接口使用簡單、資源占用率低的基于Android系統的Spatialite空間數據庫加密方法,能對加密后的Sqlite空間數據庫直接進行數據查詢、分析和統計等常用操作,并且加密后的Sqlite空間數據庫使用簡單和資源占用率低,廣泛應用于自然資源調查、地理國情調查、國土資源執法監察和林業調查等行業。
總結
以上是生活随笔為你收集整理的spatialite android,一种基于Android系统的Spatialite空间数据库加密方法与流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为kindeditor添加在线播放视频功
- 下一篇: 通达信凹口平量柱选股公式,倍量柱之后调整