最新消息:

sqlite3加密

开源项目 admin 5236浏览 0评论

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 这篇文章。

解决方案二:

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

SQLCipher has broad platform support for with C/C++, Obj-C, QT, Win32/.NET, Java, Python, Ruby, Linux, Mac OS XiPhone/iOSAndroidXamarin.iOS, andXamarin.Android.

SQLCipher对android和ios都是开源的。

windows支持:

https://github.com/CovenantEyes/sqlcipher-windows 这个已经做的很完善了

android支持:

https://github.com/sqlcipher/android-database-sqlcipher   这个已经做的很完善了

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:

https://code.launchpad.net/~jplacerda/+junk/python-sqlcipher

方案三:简短内容不存储在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

sqlite3 用SQLCipher 加密后 命令行下如何重新打开和读取

http://sqlcipher.net/sqlcipher-api/#key

PRAGMA key

The process of creating a new, encrypted database is called “keying” the database. SQLCipher uses just-in-time key derivation at the point it is first needed for an operation. This means that the key (and any options) must be set before the first operation on the database. As soon as the database is touched (e.g. SELECT, CREATE TABLE, UPDATE, etc.) and pages need to be read or written, the key is prepared for use.

 

satckoverflow.com上有人提到过在

sqlite> sqlcipher-shell32.exe  test.db

sqlite> PRAGMA KEY = ‘12345’;

给刚打开的数据库设置密码后,马上接着往数据库执行create table和 insert操作。最后用

sqlite> .e

退出该数据库。但是下次再用

sqlite> sqlcipher-shell32.exe  test.db

登录,在输入密码前执行了.schema等其他操作

sqlite>.schema

Error: file is encrypted or is not a database

sqlite> PRAGMA KEY = ‘12345’;

Error: file is encrypted or is not a database

遭到提示:Error: file is encrypted or is not a database

 

根据官方以上英文描述,这个问题就是因为操作上没有遵循just-in-time key derivation的要求,没有首先输密码解密再进行其他操作。

有图为证:

—————-以下为正确操作过程:

SQLite version 3.7.15.2 2013-01-09 11:53:05
Enter “.help” for instructions
Enter SQL statements terminated with a “;”
sqlite> PRAGMA KEY = ‘12345’;
sqlite> .schema
CREATE TABLE t(name text);
sqlite> select * from t;
n1
sqlite>

—————-以下为错误操作过程:

Enter SQL statements terminated with a “;”
sqlite> .schema
Error: file is encrypted or is not a database
sqlite> PRAGMA KEY = ‘12345’;
sqlite> .schema
Error: file is encrypted or is not a database
sqlite>

确实如此。

以上过程你可以自己亲自验证以下。

注意:通过命令行( sqlcipher-shell32.exe) 执行命令,与通过sqlite3 api调用操作sqlite3数据库,是一样的道理

本人文章除注明转载外,均为本人原创或编译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区
转载请注明:文章转载自:开源中国社区 [http://www.oschina.net]
本文标题:sqlite3 用SQLCipher 加密后 命令行下如何重新打开和读取

sqlite 数据库加密(SQLCipher)

  1. 一直使用sqlite来管理本地的数据,但是Xcode中的SDK中集成的sqlite是免费 的,不提供加密模块,但是程序中用到的很多数据,有时候是不想让别人看到,一开始虑修改sqlite的源码,自己重新编译sqlite生成一个带加密模块 的静态库,找了一下相关资料,需要修改源码中的makefile和自己实现加密算法等东西,折腾了一下,无果,就果断放弃了。此路不通,那就想别的办法来 实现加密功能:现在找到3中方法来实现数据库加密的功能
  2. 方法一、对sqlite中的数据进行加密:
  3. 就 是对数据库中插入的内容先进行aes、MD5等加密后在插入到数据库中,在使用时先从数据库中取出数据,然后在解密在使用这种方式好是好,但是有些致命的 问题不能绕过,就是你如果要对某个字段进行模糊查询操作,那么该字段就不能加密,否则的话你不能对该字段进行模糊查询操作;这样一 来该字段还是要暴漏出 来,别人还是能看到一些东西的
  4. 方法二、对插入的数据进行简单的字符替换 :
  5. 在 插入数据之前,先将一些字符用特定的字符替换掉,在使用的时候在替换回来,对与全是字符集的字段这样操作,也不会影响模糊查询操作(查询之前先用特定字符 将输入据替换,在用替换后的数据进行模糊查询,这样就不会有什么影响,同时你也可以用方法一对非查询字段进行加密;这种方法也有个致命的缺点,就是如果你 查询的字段是中文的话,这个字符替换就是个大问题,不好解决。
  6. 方法三、使用第三方库的开源库,实现对sqlite数据库的加密找来找去,SQLCipher这个开源框架不错,相关使用方法可以参考官方的文档,说的很详细,照着一步一步的做就可以了http://sqlcipher.net/ios-tutorial/ 官方的地址, 同时你可以参考一下这个blog http://blog.csdn.net/kuai0705/article/details/8931996,一些地方不是太详细,以官方文档为主
  7. 如果在编译时提示:No architectures to compile for (ARCHS=armv6,armv7, VALID_ARCHS=armv7 armv7s 则将在Bulid Settings选项下面的Architectures和Valid Architectures里面都改成一样(例如:都填 写 armv6 armv7),问题解决。 对于警告 :warning: implicit declaration of function ‘sqlite3_key’ is invalid in C99 只需要将Bulid Settings选项下的C Language Dialect 改为:C89[-std-c89] 就可以,即使用c89标准

 

sqlciper项目地址:https://github.com/sqlcipher/sqlcipher

转载请注明:jinglingshu的博客 » sqlite3加密

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址