【数据库】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允许,也是它提倡的。
& 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是支持加密扩展的;
M0 k
需要 #define 一个宏才能使用加密扩展。
  t+ h' g& E
这个宏就是   SQLITE_HAS_CODEC。 : j, m3 [- _6 T7 z+ P

你在代码最前面(也可以在 sqlite3.h 文件第一行)定义:
复制内容到剪贴板
代码:
#ifndef SQLITE_HAS_CODEC

#define SQLITE_HAS_CODEC

#endif
如果你在代码里定义了此宏,但是还能够正常编译,那么应该是操作没有成功。因为你应该会被编译器提示 有一些函数无法链接才对。如果你用的是 VC 2003,你可以在“解决方案”里右键点击你的工程,然后选“属性”,找到“C/C++”,再找到“命令行”,在里面手工添加“/D "SQLITE_HAS_CODEC"”。
 b' w- u7 N* V$ _6 Y5 N
定义了这个宏,一些被 Sqlite 故意屏蔽掉的代码就被使用了。这些代码就是加解密的接口。

尝试编译,vc会提示你有一些函数无法链接,因为找不到他们的实现。 0 o$ H5 ~) [8 i7 C, q& M" ~% F

如果你也用的是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# ]! [
下面就让我来实现这些接口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值