SQLite 加密 -- SQLCipher

來源:互聯網
上載者:User

標籤:

SQLite3 外掛程式 github   

外掛程式配置步驟地址

購買地址 

其他加密方式介紹

SQLCipher API 地址

前言

  應用使用 SQLite 來儲存資料,很多時候需要對一部分的資料進行加密。常見的做法是對要儲存的內容加密後存到資料庫中,使用的時候對資料進行解密。這樣就會有大量的效能消耗在資料的加密解密上。

  SQLite 本身是支援加密功能的 (免費版本不提供加密功能,商業版本是支援加密模組)。SQLCipher 是一個開源的 SQLite 加密的擴充,支援對 db 檔案進行 256位的 AES 加密。

  

加密與非加密的資料庫對比

  開啟 Terminal 輸入以下內容,

~ $ sqlite3 sqlcipher.dbsqlite> PRAGMA KEY=’test123′;sqlite> CREATE TABLE t1(a,b);sqlite> INSERT INTO t1(a,b) VALUES (‘one for the money’, ‘two for the show’);sqlite> .quit~$ hexdump -C sqlite.db

  

  結果:

  

 

配置步驟

  1、到 github 上下載 SQLCipher 外掛程式,並存放到項目根目錄下。

 

  2、sqlcipher.xcodeproj 以 static library 的方式添加到項目裡面。

 

  3、關聯新添加的靜態庫

  

  4、設定 Build Setting

    "Header Search Path" 添加,"../sqlcipher/src",這裡需要注意路徑的關係。

  "Other C Flags" 添加 "-DSQLITE_HAS_CODEC"

 

項目中使用樣本

#import <sqlite3.h>- (void)openDB2 {    NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];    NSString *db2Path = [documentPath stringByAppendingPathComponent:db2Name];    if (sqlite3_open([db2Path UTF8String], &database2) == SQLITE_OK) {        const char* key = [@"eileen" UTF8String];        sqlite3_key(database2, key, strlen(key));//        if (sqlite3_exec(database2, (const char*) "CREATE TABLE t1 (a, b);", NULL, NULL, NULL) == SQLITE_OK) {//            NSLog(@"password is correct, or, database has been initializ");//            //        } else {//            NSLog(@"incorrect password!");//        }//        sqlite3_close(database2);                 if (sqlite3_exec(database2, "INSERT INTO t1(a, b) VALUES(‘qqqqqqq‘, ‘pppppp‘)", NULL, NULL, NULL)==SQLITE_OK) {             NSLog(@"密碼正確");         }         else {             NSLog(@"密碼錯誤");         }                        sqlite3_stmt *statement = NULL;        sqlite3_prepare_v2(database2, "SELECT a,b FROM t1", -1, &statement, NULL);                while (sqlite3_step(statement) == SQLITE_ROW) {            char *field0 = (char*)sqlite3_column_text(statement, 0);            NSString *field0Str = @"";            if (field0) {                field0Str = [NSString stringWithUTF8String:field0];            }                        char *field1 = (char*)sqlite3_column_text(statement, 1);            NSString *field1Str = @"";            if (field1) {                field1Str = [NSString stringWithUTF8String:field1];            }            NSLog(@"a = %@, b = %@;", field0Str, field1Str);        }        sqlite3_finalize(statement);    }    else {      sqlite3_close(database2);    }}

 

 

Terminal 上安裝 SQLCipher

  總的來說在 Terminal 執行以下 2句即可,參照:

$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"    ;#  Run the configure script$ make    ;#  Run the makefile.

 

  1、cd 到下載好的 sqlcipher 目錄下,並執行

$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"

  

  2、輸入 

$ make

    2.1、發生了錯誤,

sqlite3.c:18280:10: fatal error: ‘openssl/rand.h‘ file not found

#include <openssl/rand.h>

    見:

    解決方案,輸入:

$ brew link openssl --force

  

    2.2、發生錯誤,“-bash: brew: command not found”,證明 OS 尚未安裝 Homebrew。(安裝 Homebrew 的前提下是安裝了 Xcode, 並且 Command Line Tools 已安裝, Terminal 輸入 "gcc --version" 檢查)

    解決方案,輸入:

$ -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

 

    2.3、安裝好 Homebrew 後,重新執行

$ brew link openssl --force

    發生了錯誤:Error: No such keg: /usr/local/Cellar/openssl

    解決方案,使用 brew 安裝 openssl,輸入:

$ brew install openssl

  

  

    2.4、安裝完 openssl 後,重新執行

$ brew link openssl --force

  

    執行完後,再重新執行

$ make

  

    多次執行 make 操作會發生錯誤 “make: Nothing to be done for `all‘”,解決方案,輸入:

$ make clean// 重新執行$ make

  

  3、執行完前面 2 步,sqlcipher 目錄下會多了一個 sqlcipher 檔案,用於 Terminal 中管理資料庫。

  

 

 

Terminal 查看和修改資料庫的密碼管理

  cd 到剛才新產生的 sqlcipher 檔案的目錄下,執行以下的操作,參照。

  1、使用 SQLCipher 加密已經存在的資料庫

$ ./sqlcipher plaintext.db sqlite> ATTACH DATABASE ‘encrypted.db‘ AS encrypted KEY ‘testkey‘; sqlite> SELECT sqlcipher_export(‘encrypted‘); sqlite> DETACH DATABASE encrypted; 

  

  2、解除使用 SQLCipher 加密的資料庫密碼

$ ./sqlcipher encrypted.db sqlite> PRAGMA key = ‘testkey‘; sqlite> ATTACH DATABASE ‘plaintext.db‘ AS plaintext KEY ‘‘;  -- empty key will disable encryptionsqlite> SELECT sqlcipher_export(‘plaintext‘); sqlite> DETACH DATABASE plaintext; 

  

 

注意

  有些軟體的加密方式是不公開的,例如 Mac SQLiteManager 產生的加密的 .db 檔案沒法在程式裡面解密開啟。程式裡面產生的加密的 .db 檔案也沒法用 Mac 上的 SQLiteManager 開啟。

  免費版本的項目代碼不提供以下的功能:

  • 資料庫建立的時候,沒有使用 sqlite3_key 設定密碼,之後不能添加密碼管理;
  • 對建立時已經設定了密碼管理的資料庫,不能取消其密碼管理,只能重新設定新的密碼;

 

SQLite 加密 -- SQLCipher

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.