【数据库】SQLITE3 加密1
给数据库加密前面所说的内容网上已经有很多资料,虽然比较零散,但是花点时间也还是可以找到的。现在要说的这个——数据库加密,资料就很难找。也可能是我操作水平不够,找不到对应资料。但不管这样,我还是通过网上能找到的很有限的资料,探索出了给sqlite数据库加密的完整步骤。6 R: j' I) k8 G1 g* J# h- J
这里要提一下,虽然 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 Sqlite免费版本是不提供加 密功能的,当然你也可以选择他们的收费版本,那你得支付2000块钱,而且是USD。我这里也不是说支付钱不好,如果只为了数据库加密就去支付2000 块,我觉得划不来。因为下面我将要告诉你如何为免费的Sqlite扩展出加密模块——自己动手扩展,这是Sqlite允许,也是它提倡的。 5 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是支持加密扩展的; ; }9 p! W; c; V0 D+ y3 M0 k 需要 #define 一个宏才能使用加密扩展。 ; j# v- O t+ h' g& E 这个宏就是 SQLITE_HAS_CODEC。: j, m3 [- _6 T7 z+ P 你在代码最前面(也可以在 sqlite3.h 文件第一行)定义: 复制内容到剪贴板
如果你在代码里定义了此宏,但是还能够正常编译,那么应该是操作没有成功。因为你应该会被编译器提示 有一些函数无法链接才对。如果你用的是 VC 2003,你可以在“解决方案”里右键点击你的工程,然后选“属性”,找到“C/C++”,再找到“命令行”,在里面手工添加“/D "SQLITE_HAS_CODEC"”。代码:#ifndef SQLITE_HAS_CODEC ) o! o: b' w- u7 N* V$ _6 Y5 N 定义了这个宏,一些被 Sqlite 故意屏蔽掉的代码就被使用了。这些代码就是加解密的接口。 尝试编译,vc会提示你有一些函数无法链接,因为找不到他们的实现。0 o$ H5 ~) [8 i7 C, q& M" ~% F 如果你也用的是VC2003,那么会得到下面的提示: 复制内容到剪贴板
这是正常的,因为Sqlite只留了接口而已,并没有给出实现。% h) b& _. C$ m8 n; k& e* j, Q代码:error LNK2019: 无法解析的外部符号 _sqlite3CodecGetKey ,该符号在函数 _attachFunc 中被引用 ) q3 R* m. A8 F+ G# ]! [ 下面就让我来实现这些接口。 |