【数据库】SQLITE3 加密1

给数据库加密

前面所说的内容网上已经有很多资料,虽然比较零散,但是花点时间也还是可以找到的。现在要说的这个——数据库加密,资料就很难找。也可能是我操作水平不够,找不到对应资料。但不管这样,我还是通过网上能找到的很有限的资料,探索出了给sqlite数据库加密的完整步骤。6 R: j' I) k8 G1 g* J# h- J

, `" a+ o5 x, `6 }* T这里要提一下,虽然 sqlite 很好用,速度快、体积小巧。但是它保存的文件却是明文的。若不信可以用 NotePad 打开数据库文件瞧瞧,里面 insert 的内容几乎一览无余。这样赤裸裸的展现自己,可不是我们的初衷。当然,如果你在嵌入式系统、智能手机上使用 sqlite,最好是不加密,因为这些系统运算能力有限,你做为一个新功能提供者,不能把用户有限的运算能力全部花掉。7 b" {* B" H9 Q; b. p+ {4 C
( N3 F. Q/ a2 e+ Y0 N$ F9 a
Sqlite为了速度而诞生。因此Sqlite本身不对数据库加密,要知道,如果你选择标准AES算法加密,那么一定有接近50%的时间消耗在加解密算法 上,甚至更多(性能主要取决于你算法编写水平以及你是否能使用cpu提供的底层运算能力,比如MMX或sse系列指令可以大幅度提升运算速度)。* ?$ Q* }( j5 F   x

   v7 ]   s" }) z3 N( @Sqlite免费版本是不提供加 密功能的,当然你也可以选择他们的收费版本,那你得支付2000块钱,而且是USD。我这里也不是说支付钱不好,如果只为了数据库加密就去支付2000 块,我觉得划不来。因为下面我将要告诉你如何为免费的Sqlite扩展出加密模块——自己动手扩展,这是Sqlite允许,也是它提倡的。
! F1 g+ I: V! i% C& K5 m3 N' v& ?) D" B& t
那么,就让我们一起开始为 sqlite3.c 文件扩展出加密模块。8 D$ Y7 K) S+ i( ^7 l
3 ~1 G5 Z% h* |0 [0 C) O
* r3 G   o8 a$ v( h* G
7 T1 M% `% F( R' L7 C8 F
i.1       必要的宏0 ]) j, x; k1 E1 `% ~
" ^* h5 ^- e* _; `8 v   G
通过阅读 Sqlite 代码(当然没有全部阅读完,6万多行代码,没有一行是我习惯的风格,我可没那么多眼神去看),我搞清楚了两件事:: L0 V& D: v5 b+ D: \4 }( `
5 z" k1 j! Y; ~- [9 }
Sqlite是支持加密扩展的;
# d4 y0 a7 ?% V; I& {; }9 p! W; c; V0 D+ y3 M0 k
需要 #define 一个宏才能使用加密扩展。
' j2 T4 {$ [" ?7 {. h+ T; j# v- O   t+ h' g& E
这个宏就是   SQLITE_HAS_CODEC。: j, m3 [- _6 T7 z+ P

4 W+ J' P0 M* g1 g7 q3 z0 v+ w你在代码最前面(也可以在 sqlite3.h 文件第一行)定义:
复制内容到剪贴板
代码:
#ifndef SQLITE_HAS_CODEC

#define SQLITE_HAS_CODEC

#endif
如果你在代码里定义了此宏,但是还能够正常编译,那么应该是操作没有成功。因为你应该会被编译器提示 有一些函数无法链接才对。如果你用的是 VC 2003,你可以在“解决方案”里右键点击你的工程,然后选“属性”,找到“C/C++”,再找到“命令行”,在里面手工添加“/D "SQLITE_HAS_CODEC"”。
( g4 c' A! V7 g- z) o! o: b' w- u7 N* V$ _6 Y5 N
定义了这个宏,一些被 Sqlite 故意屏蔽掉的代码就被使用了。这些代码就是加解密的接口。
& B7 S$ j+ @+ m   W6 m
$ ~$ ^+ F% G' _- e) a* o- }0 G尝试编译,vc会提示你有一些函数无法链接,因为找不到他们的实现。0 o$ H5 ~) [8 i7 C, q& M" ~% F

, I   m, s. `7 o2 M+ \- o. @5 G; V如果你也用的是VC2003,那么会得到下面的提示:
复制内容到剪贴板
代码:
error LNK2019: 无法解析的外部符号 _sqlite3CodecGetKey ,该符号在函数 _attachFunc 中被引用

error LNK2019: 无法解析的外部符号 _sqlite3CodecAttach ,该符号在函数 _attachFunc 中被引用

error LNK2019: 无法解析的外部符号 _sqlite3_activate_see ,该符号在函数 _sqlite3Pragma 中被引用

error LNK2019: 无法解析的外部符号 _sqlite3_key ,该符号在函数 _sqlite3Pragma 中被引用

fatal error LNK1120: 4 个无法解析的外部命令
这是正常的,因为Sqlite只留了接口而已,并没有给出实现。% h) b& _. C$ m8 n; k& e* j, Q
) q3 R* m. A8 F+ G# ]! [
下面就让我来实现这些接口。

posted @ 2009-05-16 13:51  jcss  阅读(773)  评论(0编辑  收藏  举报