python sqlite3加密_sqlite3加密 - kjpioo的个人空间 - OSCHINA - 中文开源技术交流社区...

SQLite 3 开源版不带加密功能,对于一个保存在本地的数据库来说没有加密功能让人难以接受,只要用记事本打开数据库就可以看到数据库内保存的数据,对安全多多少少有一点影响。有一个办法是把内容加密后保存到数据库中,但遇到类似 like,或字段内容与字段内容比较这就不行了。治本的办法是让 SQLite 原生的支持加密。好在 SQLite 的作者预留了加密解密的相关接口,许多爱好者也自己修改源版添加加密功能。如果你也在关注,那你可能已经阅读了大量关于如何添加加密的文章,同时我也不是很通相关的技术,我就不再讲解如何修改源码了。虽然网上有大量的文章教你如何修改源码,但都没有提供编译后的 DLL 文件,或者提供的 DLL 版本过低。

解决方案一:

这里介绍一个开源项目:wxSQLite3,该项目是一个 SQLite 的 C++ warpper,它顺带将 SQLite 的加密函数实现了,并且它使用 AES 算法进行加密。你可以在http://sourceforge.net/projects/wxcode/files/Components/下载到最新的包,在目录 \sqlite3\secure 下你可以找到一个 sqlite3.dll 文件,这个就是已编译的带加密的 SQLite 3 DLL 文件,而且 wxSQLite3 项目更新很快,你总是可以下载到较新的包。在最新的1.9.8版本中开始对256位AES加密进行实验,估计不久的版本就可以稳定使用。

使用起来也很简单,首先打开数据库 sqlite3_open,然后在操作数据库之前执行 sqlite3_key 后就可进行数据库操作,否则会返回错误。

sqlite3_key是输入密钥,如果数据库已加密必须先执行此函数并输入正确密钥才能进行操作,如果数据库没有加密,执行此函数后进行数据库操作反而会出现“此数据库已加密或不是一个数据库文件”的错误。

int sqlite3_key( sqlite3 *db, const void *pKey, int nKey),db 是指定数据库,pKey 是密钥,nKey 是密钥长度。例:sqlite3_key( db, "abc", 3);

sqlite3_rekey是变更密钥或给没有加密的数据库添加密钥或清空密钥,变更密钥或清空密钥前必须先正确执行 sqlite3_key。在正确执行 sqlite3_rekey 之后在 sqlite3_close 关闭数据库之前可以正常操作数据库,不需要再执行 sqlite3_key。

int sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),参数同上。

清空密钥为 sqlite3_rekey( db, NULL, 0)。

缺点:

严重依赖于wxWidgets C++ library。不利于发布,编译、维护繁琐。要去除对wxwidgets的依赖,可以参考http://blog.csdn.net/tszhao/article/details/7254160这篇文章。

解决方案二:

SQLite数据库的传输层进行全面加密的工具。而通过使用 SQLCipher ,整个加密过程对客户端是透明的,无需改动应用程序。

SQLCipher has broad platform support for withC/C++, Obj-C, QT,Win32/.NET, Java, Python, Ruby, Linux,Mac OS X,iPhone/iOS,Android,Xamarin.iOS, andXamarin.Android.

SQLCipher对android和ios都是开源的。

windows支持:

android支持:

iphone支持:

待补充。

python支持:

SQLCipher is an SQLite extension that provides transparent 256-bit AES encryption of database files.

In order to encrypt a new database or query existing data you must key it before using it.

This app does it for you. You only need to specify the database key in your project's settings.py file.

For more about SQLCipher take a look at http://sqlcipher.net/.

Requirements

python-sqlcipher (Python compiled with SQLCipher support)

For more about python-sqlcipher take a look at:

方案三:简短内容不存储在sqlite3中,用crypto加密成文件

在此我们将使用到PyCrypto模块,可以访问

http://www.pycrypto.org/ 来获得此模块。该模块包括多种加密算法,如AES、MD5、SHA等,我们可以访问https://www.dlitz.net/software/pycrypto/apidoc/ 来查看相关API.

PyCrypto模块的功能是非常强大的,此处仅起抛砖引玉的作用,感兴趣的朋友可以稳步至其官方网站,其中有很多算法的例子。

[Python]代码片段

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#encoding:utf-8

"""

示例代码

"""

fromCrypto.CipherimportAES

key='0123456789abcdef'

mode=AES.MODE_CBC

encryptor=AES.new(key, mode)

text='j'*64+'i'*128

ciphertext=encryptor.encrypt(text)

"""

上例中的key是16位, 还可以是24 或 32 位长度, 其对应为 AES-128, AES-196 和 AES-256.

解密则可以用以下代码进行:

"""

#decryptor = AES.new(key, mode)

#plain = decryptor.decrypt(ciphertext)

欢迎加入 sqlite3 加密 全文搜索 讨论组qq群号: 330649719

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值