android資料儲存之sqlite的介紹及使用
)以及contentprovider程式間資料共享(
android探索之contentprovider熟悉而又陌生的元件
),我們清晰的知道sqlite資料庫預設存放位置
data/data/pakage/database目錄下,對於已經root的手機來說的沒有任何安全性可以,一旦被利用將會導致資料庫資料的洩漏,所以我們該如何避免這種事情的發生呢?我們嘗試這對資料庫進行加密。
選擇加密方案:
1.)第一種方案
我們可以對資料的資料庫名,表名,列名就行md5,對儲存的資料進行加密,例如進行aes加密(android資料加密之aes加密),查詢的時候再對資料進行解密,這種方式不能說不好,但是使用起來可以想象一下其帶來的麻煩程度。
2.)第二種方案
採用第三方加密開源庫,查詢了很多種android 資料庫加密方案,最終選定sqlcipher這個開源框架,接下來看下sqlcipher如何使用。
sqlcipher簡介:
sqlcipher是乙個在sqlite基礎之上進行擴充套件的開源資料庫,sqlcipher具有占地面積小、效能因此它非常適合嵌入式應用的資料庫保護,非常適合於移動開發。
優勢:
sqlcipher使用方式:
1.)在build.gradle文中新增如下**,當前使用的是最新版本3.4.0
dependencies
也可以使用demo:sqlcipher for android v2.2.2.7z
2.)建立乙個sqliteopenhelper 注意接下來所以有關sqlite相關類全部引用net.sqlcipher.database的類
如果是寫好的專案:只需要將報名替換就好了:
注意:sqlitedatabase.loadlibs(context);這個千萬別忘記呼叫
import android.content.context;
import android.util.log;
import net.sqlcipher.sqlexception;
import net.sqlcipher.database.sqlitedatabase;
import net.sqlcipher.database.sqliteopenhelper;
public class dbcipherhelper extends sqliteopenhelper
public dbcipherhelper(context context)
/*** 建立資料庫
* @param db
*/@override
public void oncreate(sqlitedatabase db)
private void createtable(sqlitedatabase db) catch (sqlexception e)
}/**
* 資料庫公升級
* @param db
* @param oldversion
* @param newversion
*/@override
public void onupgrade(sqlitedatabase db, int oldversion, int newversion)
}
3.)建立乙個dbciphermanager資料庫管理
具體實現傳統的sqliteopenhelper都是完全相同的,不同的地方在獲取資料庫控制代碼的地方
傳統方式:
//獲取可寫資料庫
sqlitedatabase db = dbhelper.getwritabledatabase();
//獲取可讀資料庫
sqlitedatabase db = dbhelper.getreadabledatabase();
現在的方式:需要傳入乙個password,這個password就是用於加密的秘鑰
//獲取寫資料庫
sqlitedatabase db = dbhelper.getwritabledatabase(dbcipherhelper.db_pwd);
//獲取可讀資料庫
sqlitedatabase db = dbhelper.getreadabledatabase(dbcipherhelper.db_pwd);
接下來就是具體實現:
import android.content.contentvalues;
import android.content.context;
import android.util.log;
import net.sqlcipher.cursor;
import net.sqlcipher.sqlexception;
import net.sqlcipher.database.sqlitedatabase;
/** * 資料庫管理者 - 提供資料庫封裝
* */
public class dbciphermanager
/*** 獲取單例引用
** @param context
* @return
*/public static dbciphermanager getinstance(context context) }}
return inst;
}/**
* 插入資料
*/public void insertdata(string name)
/*** 未開啟事務批量插入
* @param testcount
*/public void insertdatasbynomarl(int testcount)
//刪除資料
dbciphermanager.getinstance(mainactivity.this).deletedata(string.valueof(5));
//更新資料
dbciphermanager.getinstance(mainactivity.this).updatedata(string.valueof(3));
//查詢資料
dbciphermanager.getinstance(mainactivity.this).querydatas();
5.)事務支援和傳統方式一樣
//獲取寫資料庫
sqlitedatabase db = dbhelper.getwritabledatabase();
db.begintransaction(); //手動設定開始事務
try{
//在此處理批量操作
for(int i =0;i6)檢查加密效果
a. 在root過的手機,通過資料庫編輯器檢視改應用的資料庫:
b.可以使用sqlite expert professional.7z進行檢視資料庫結構;
eg資料庫:加密和未加密的sql
可以發現找不到資料庫檔案,資料庫檔案已經被包裝過了。
7)從命令列進入手機,檢視資料庫:
adb shell
cd /data/data/com.example.sqlcipherdemo/databases
sqlite3 demo.db
.table
結果:error:file is encrypted or is not a database,可以發現找不到資料庫檔案,資料庫檔案已經被包裝過了。
資料庫SQL 資料加密 示例操作
示例一,使用證書加密資料.建立測試資料表 create table tb id int identity 1,1 data varbinary 8000 go 建立主金鑰 create master key encryption by password 654321 建立證書一,該證書使用資料庫主金...
c sqlite 資料庫加密
用了 ado.net 2.0 sqlite data provider 這樣可以直接利用它來建立乙個 加密的sqlite資料庫。有關c 如下 1 建立空的sqlite資料庫。資料庫名的字尾你可以直接指定,甚至沒有字尾都可以 方法一 建立乙個空sqlite資料庫,用io的方式 filestream f...
access資料庫加密
問題 關於jet db的連線字串,以及加密後的字串ado連線mdb檔案的字串如何寫?加密以後如何寫?回答 access資料庫加密分3種 以下以access xp為例 1 工具 安全 加密 解密資料庫,開啟時無需任何更改 2 工具 安全 設定資料庫密碼,開啟密碼為 1 開啟時需要使用 provider...