Android 資料庫加密 SQL加密

2021-08-09 20:30:43 字數 4093 閱讀 7935

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...