【資料庫】SQLITE3 加密3

來源:互聯網
上載者:User
上面寫了兩個擴充函數,如何把擴充函數跟 Sqlite 掛接起來,這個過程說起來比較麻煩。我直接貼代碼。
/ I" l   _$ K6 }( V+ N7 G# ~
% Z# ^7 P; H" U% u分3個步驟。
8 ?2 |3 V; D7 r! H, n9 W+ A7 R6 j; G; s   o" }8 g2 Y' x" o
首先,在 sqlite3.c 檔案頂部,添加下面內容:

複製內容到剪貼簿

代碼:

#ifdef SQLITE_HAS_CODEC

#include "./crypt.h"

/***********

用於在 sqlite3 最後關閉時釋放一些記憶體

***********/

void sqlite3pager_free_codecarg(void *pArg);

#endif

這個函數之所以要在 sqlite3.c 開頭聲明,是因為下面在 sqlite3.c 裡面某些函數裡要插入這個函數調用。所以要提前聲明。5 [9 e- u/ a& C- b3 X3 g; I

1 V1 D/ m- J   U8 Z ( ]* [5 j# @/ w2 a, v
. B! C   z; a5 _9 O3 a
其次,在sqlite3.c檔案裡搜尋“sqlite3PagerClose”函數,要找到它的實現代碼(而不是聲明代碼)。3 z( e( m   L4 r; t& \

9 G2 [# n% w" }* R實現代碼裡一開始是:

複製內容到剪貼簿

代碼:

#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT

   /* A malloc() cannot fail in sqlite3ThreadData() as one or more calls to

   ** malloc() must have already been made by this thread before it gets

   ** to this point. This means the ThreadData must have been allocated already

   ** so that ThreadData.nAlloc can be set.

   */

   ThreadData *pTsd = sqlite3ThreadData();

   assert( pPager );

   assert( pTsd && pTsd->nAlloc );

#endif

需要在這部分後面緊接著插入:

複製內容到剪貼簿

代碼:

#ifdef SQLITE_HAS_CODEC

   sqlite3pager_free_codecarg(pPager->pCodecArg);

#endif

這裡要注意,sqlite3PagerClose 函數大概也是 3.3.17版本左右才改名的,以前版本裡是叫 “sqlite3pager_close”。因此你在老版本sqlite代碼裡搜尋“sqlite3PagerClose”是搜不到的。# U& Z' b" z) Y; j# i

( F5 H0 V1 L( V; J; t7 p類似的還有 “sqlite3pager_get”、“sqlite3pager_unref”、“sqlite3pager_write”、 “sqlite3pager_pagecount”等都是老版本函數,它們在 pager.h 檔案裡定義。新版本對應函數是在 sqlite3.h 裡定義(因為都合并到 sqlite3.c和sqlite3.h兩檔案了)。所以,如果你在使用老版本的sqlite,先看看 pager.h 檔案,這些函數不是消失了,也不是新蹦出來的,而是老版本函數改名得到的。
1 Y! u# V. P9 I/ R5 U" s
( O( {3 S9 Y# {* M% b2 i5 w
4 Q+ m8 V- n) P
. u+ o( u0 L- T# A% S' L0 B( C0 U& B最後,往sqlite3.c 檔案下找。找到最後一行:

複製內容到剪貼簿

代碼:

/************** End of main.c ************************************************/

在這一行後面,接上本文最下面的程式碼片段。
6 C+ |. i! C( M( E. H5 O9 B. n& a8 o' Z1 @: `4 K
這些代碼很長,我不再解釋,直接接上去就得了。
- p& [. m0 Y, W$ {+ b8 u
# @5 ]2 d   v3 {2 V唯一要提的是 DeriveKey 函數。這個函數是對密鑰的擴充。比如,你要求密鑰是128位,即是16位元組,但是如果使用者只輸入 1個位元組呢?2個位元組呢?或輸入50個位元組呢?你得對密鑰進行擴充,使之符合16位元組的要求。
4 C- ]   f& q! I5 D$ i' T
0 J7 {1 e( @3 ]/ B4 x: kDeriveKey 函數就是做這個擴充的。有人把接收到的密鑰求md5,這也是一個辦法,因為md5運算結果固定16位元組,不論你有多少字元,最後就是16位元組。這是md5 演算法的特點。但是我不想用md5,因為還得為它添加包含一些 md5 的.c或.cpp檔案。我不想這麼做。我自己寫了一個演算法來擴充密鑰,很簡單的演算法。當然,你也可以使用你的擴充方法,也而可以使用 md5 演算法。只要修改 DeriveKey 函數就可以了。
3 V2 \* G. N, \$ A* s. N5 a
& J& d, ?9 B) y( g- w在 DeriveKey 函數裡,只管申請空間構造所需要的密鑰,不需要釋放,因為在另一個函數裡有釋放過程,而那個函數會在資料庫關閉時被調用。參考我的 DeriveKey 函數來申請記憶體。. ~+ Z* X8 R: C; o

- }" `+ I2 w* B" d, Y5 l* R+ ^2 {
2 E   v8 Q$ H! _+ z$ ?1 N" Y* |/ w9 D1 b
這裡我給出我已經修改好的 sqlite3.c 和 sqlite3.h 檔案。
& }+ |# l( |% ^8 u
) d; a5 w& v$ H如果太懶,就直接使用這兩個檔案,編譯肯定能通過,運行也正常。當然,你必須按我前面提的,建立 crypt.h 和 crypt.c 檔案,而且函數要按我前面定義的要求來做。

.4 sqlite3.c 最後添加程式碼片段 複製內容到剪貼簿

代碼:

/***

董淳光定義的加密函數

***/

#ifdef SQLITE_HAS_CODEC

/***

加密結構

***/

#define CRYPT_OFFSET 8

typedef struct _CryptBlock

{

BYTE*     ReadKey;     // 讀資料庫和寫入事務的密鑰

BYTE*     WriteKey; // 寫入資料庫的密鑰

int    PageSize; // 頁的大小

BYTE*     Data;

} CryptBlock, *LPCryptBlock;

#ifndef   DB_KEY_LENGTH_BYTE       /*密鑰長度*/

#define   DB_KEY_LENGTH_BYTE 16 /*密鑰長度*/

#endif

#ifndef   DB_KEY_PADDING          /*密鑰位元不足時補充的字元*/

#define   DB_KEY_PADDING    0x33   /*密鑰位元不足時補充的字元*/

#endif

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.