sqlite3 加密

https://github.com/utelle/wxsqlite3 提供了加密版的 sqlite,支持 premake5 編譯证鸥。

SQLite3 的加密函數(shù)說明

sqlite3_key 是輸入密鑰僚楞,如果數(shù)據(jù)庫已加密必須先執(zhí)行此函數(shù)并輸入正確密鑰才能進(jìn)行操作,如果數(shù)據(jù)庫沒有加密枉层,執(zhí)行此函數(shù)后進(jìn)行數(shù)據(jù)庫操作反而會出現(xiàn) “此數(shù)據(jù)庫已加密或不是一個數(shù)據(jù)庫文件” 的錯誤泉褐。

int sqlite3_key(sqlite3 *db, const void *pKey, int nKey),db 是指定數(shù)據(jù)庫鸟蜡,pKey 是密鑰膜赃,nKey 是密鑰長度。例:sqlite3_key( db, "abc", 3);

sqlite3_rekey 是變更密鑰或給沒有加密的數(shù)據(jù)庫添加密鑰或清空密鑰矩欠,變更密鑰或清空密鑰前必須先正確執(zhí)行 sqlite3_key财剖。在正確執(zhí)行 sqlite3_rekey 之后在 sqlite3_close 關(guān)閉數(shù)據(jù)庫之前可以正常操作數(shù)據(jù)庫悠夯,不需要再執(zhí)行 sqlite3_key

int sqlite3_rekey(sqlite3 *db, const void *pKey, int nKey)躺坟,參數(shù)同上沦补。

清空密鑰為 sqlite3_rekey(db, NULL, 0)

其實 SQLite 的兩個加密函數(shù)使用起來非常的簡單咪橙,下面分情況說明:

  1. 給一個未加密的數(shù)據(jù)庫添加密碼:如果想要添加密碼夕膀,則可以在打開數(shù)據(jù)庫文件之后,關(guān)閉數(shù)據(jù)庫文件之前的任何時刻調(diào)用 sqlite3_key 函數(shù)即可美侦,該函數(shù)有三個參數(shù)产舞,其中第一個參數(shù)為數(shù)據(jù)庫對象,第二個參數(shù)是要設(shè)定的密碼菠剩,第三個是密碼的長度易猫。例如:
sqlite3_key(db,"1q2w3e4r",8);        // 給數(shù)據(jù)庫設(shè)定密碼 1q2w3e4r

注:如果數(shù)據(jù)庫沒有加密,執(zhí)行此函數(shù)后進(jìn)行數(shù)據(jù)庫操作反而會出現(xiàn) “此數(shù)據(jù)庫已加密或不是一個數(shù)據(jù)庫文件” 的錯誤具壮?經(jīng)測試准颓,只能在新建數(shù)據(jù)庫時設(shè)置密碼!

  1. 讀取一個加密數(shù)據(jù)庫中的數(shù)據(jù):完成這個任務(wù)依然十分簡單棺妓,你只需要在打開數(shù)據(jù)庫之后攘已,再次調(diào)用一下 sqlite3_key 函數(shù)即可,例如怜跑,但數(shù)據(jù)庫密碼是 123456 時样勃,你只需要在代碼中加入 sqlite3_key(db,"123456",6);

  2. 更改數(shù)據(jù)庫密碼:首先你需要使用當(dāng)前的密碼正確的打開數(shù)據(jù)庫,之后你可以調(diào)用 sqlite3_rekey(db,"112233",6) 來更改數(shù)據(jù)庫密碼性芬。

  3. 刪除密碼:也就是把數(shù)據(jù)庫恢復(fù)到明文狀態(tài)破加。這時你仍然只需要調(diào)用 sqlite3_rekey 函數(shù)揪利,并且把該函數(shù)的第二個參數(shù)置為 NULL 或者 "", 或者把第三個參數(shù)設(shè)為 0直砂。

SQLite 添加了加密解密功能后供璧,使用方法如下:

  1. 在調(diào)用 sqlite3_open() 函數(shù)打開數(shù)據(jù)庫后,要調(diào)用 sqlite3_key() 函數(shù)為數(shù)據(jù)庫設(shè)置密碼汽煮;

  2. 如果數(shù)據(jù)庫之前有密碼搏熄,則調(diào)用 sqlite3_key() 函數(shù)設(shè)置正確密碼才能正常工作;

  3. 如果一個數(shù)據(jù)庫之前沒有密碼暇赤,且已經(jīng)有數(shù)據(jù)心例,則不能再為其設(shè)置密碼;

  4. 如果要修改密碼鞋囊,則需要在第一步操作后止后,調(diào)用 sqlite3_rekey() 函數(shù)設(shè)置新的密碼;

  5. 設(shè)置了密碼的 SQLite 數(shù)據(jù)庫,無法使用第三方工具打開译株;

sqlite 編輯器瓜喇,是 SQLite Developer,里邊其實帶著加密功能呢歉糜,如圖

只不過這個加密是用的自帶的 sqlite3.dll 里的函數(shù)乘寒,我們呢,只要把. wxsqlite3 文件夾下 sqlite3\secure\aes128\dll\release 里的 sqlite3.dll 替換掉 SQLite Developer 的 sqlite3.dll, 然后你可以直接用 SQLite Developer 對 數(shù)據(jù)庫文件加密了匪补,并且程序里伞辛,只要 sqlite3_key() 后也可以正常讀取數(shù)據(jù),艾瑪夯缺,太美好了蚤氏。

而且大家不要擔(dān)心上邊圖片里的 “clear Encryption key”,這個老七測試過了踊兜,只有你自己設(shè)置的密碼竿滨,才會出現(xiàn)這個選項,因為密碼被記錄在 SQLite Developer 里捏境,已經(jīng)加過密的數(shù)據(jù)庫姐呐,這里邊只有
,ok 啦典蝌,no 有問題啦。既加密了數(shù)據(jù)庫头谜,又不影響我們開發(fā)骏掀。

使用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i;

    for (i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }

    printf("\n");
    return 0;
}

static char* passwd = "helloworld";

int main(int argc, char* argv[])
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int  rc;
    char *sql;
    /* Open database */
    rc = sqlite3_open("test.db", &db);

    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        exit(0);
    } else {
        fprintf(stdout, "Opened database successfully\n");
    }

    rc = sqlite3_key(db, passwd, strlen(passwd));

    if (rc) {
        fprintf(stderr, "Can't encrypt database: %s\n", sqlite3_errmsg(db));
        exit(0);
    } else {
        fprintf(stdout, "Encrypt database successfully\n");
    }

    /* Create SQL statement */
    sql = "CREATE TABLE IF NOT EXISTS COMPANY ("  \
          "ID INT PRIMARY KEY     NOT NULL," \
          "NAME           TEXT    NOT NULL," \
          "AGE            INT     NOT NULL," \
          "ADDRESS        CHAR(50)," \
          "SALARY         REAL );"; //Create table
    /* Execute SQL statement */
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Table created successfully\n");
    }

    sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
          "VALUES (1, 'Paul', 32, 'California', 20000.00); " \
          "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) "  \
          "VALUES (2, 'Allen', 25, 'Texas', 15000.00); "     \
          "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
          "VALUES (3, 'Teddy', 23, 'Norway', 20000.00);" \
          "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \
          "VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00);";  //Insert data
    /* Execute SQL statement */
    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Records created successfully\n");
    }

    /* Create SQL statement */
    sql = "SELECT * from COMPANY"; //Select data
    /* Execute SQL statement */
    const char* data = "Callback function called";
    rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    } else {
        fprintf(stdout, "Operation done successfully\n");
    }

    sqlite3_close(db);
    return 0;
}

CppSQLite3 是對 sqlite3 的一個 C++ 封裝。
CppSQLite3U is a C++ unicode wrapper around the SQLite database柱告。
http://softvoile.com/development/CppSQLite3U/

links

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末截驮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子际度,更是在濱河造成了極大的恐慌葵袭,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乖菱,死亡現(xiàn)場離奇詭異坡锡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)窒所,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門鹉勒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吵取,你說我怎么就攤上這事禽额。” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵脯倒,是天一觀的道長实辑。 經(jīng)常有香客問我,道長藻丢,這世上最難降的妖魔是什么剪撬? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮郁岩,結(jié)果婚禮上婿奔,老公的妹妹穿的比我還像新娘。我一直安慰自己问慎,他們只是感情好萍摊,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著如叼,像睡著了一般冰木。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笼恰,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天踊沸,我揣著相機(jī)與錄音,去河邊找鬼社证。 笑死逼龟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的追葡。 我是一名探鬼主播腺律,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼宜肉!你這毒婦竟也來了匀钧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谬返,失蹤者是張志新(化名)和其女友劉穎之斯,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體遣铝,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡佑刷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了翰蠢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片项乒。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖梁沧,靈堂內(nèi)的尸體忽然破棺而出檀何,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布频鉴,位于F島的核電站栓辜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏垛孔。R本人自食惡果不足惜藕甩,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望周荐。 院中可真熱鬧狭莱,春花似錦、人聲如沸概作。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讯榕。三九已至骤素,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間愚屁,已是汗流浹背济竹。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留霎槐,地道東北人送浊。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像丘跌,于是被迫代替她去往敵國和親罕袋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 使用的過程根據(jù)使用的函數(shù)大致分為如下幾個過程: sqlite3_open() sqlite3_prepare() ...
    隨風(fēng)飄蕩的小逗逼閱讀 6,568評論 0 3
  • SQLite是一個進(jìn)程庫碍岔,實現(xiàn)了一個 自包含的, 無服務(wù)器朵夏, 零配置蔼啦, 事務(wù)性 的SQL數(shù)據(jù)庫引擎。SQLite是...
    xyf_tc閱讀 12,128評論 0 6
  • Sqlite3 開源版的Sqlite3是不支持加密功能的仰猖,對于一個保存在本地的數(shù)據(jù)庫來說沒有加密功能讓人難以接受捏肢。...
    四明羽客閱讀 3,727評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)饥侵,斷路器鸵赫,智...
    卡卡羅2017閱讀 134,699評論 18 139
  • humorson閱讀 144評論 0 0