cocos2d-x 2.1 Win32+Android开发中的sqlite数据库加密技术探讨
注意:本博客转移自本人约一年前的ITPUB博客文章,为的是便于学员参考之用。
很显然,cocos2d-x编程中只了解基本的sqlite数据库操作技术只是一个开头,真正把此数据库数据应用于实际中不使用一定的加密及解密技术几乎是不行的。
这个问题尽早会来到我面前,这不?现在就来了。一开始,自然想使用最省工的了;但是,这样的好事并不多,极少极少。。。。。。
于是,我先搜罗了一些现成的文章拿来一阅。
1,Sqlite数据库加密解密
SRC: http://blog.sina.com.cn/s/blog_55cbb3d10100pdsp.html
现在是信息时代,各种各样的数据总是伴随我们的日常工作和学习,前面介绍了Sqlite数据库的基本操作,可免费版的sqlite本身不带加密功能,想把自己的数据库加密的话,可以自己编译源代码加入有关函数,这好麻烦啊,特别是对于我这种拿来主义的忠实粉丝!好在有高手为我们解决了这个难题。我们可以在这个链接里面了解有关sqlite加密的一个方法并下载相关的可执行文件。 http://sqlite-crypt.com/documentation.htm
(1)加密数据库 下载后,和普通版sqlite一样,也是一个可执行文件,操作方法稍微不同,普通sqlite数据库操作语句为:>sqlite3test.db 使用这个加密版sqlite则需要这样做: >sqlite.exe test.db#这样就生成一个新数据库,普通数据库 >.changepasspass #这句就给当前数据库加上了密码,下次打开要用下面的语句 >sqlite.exe passtest.db
这样就将test.db加密了,密码为pass。加密之后可以进行普通的操作,如创建表,插入数据,查询等,语句和普通不加密版的sqlite语句完全一样
(2)改变密码 打开一个加密数据库后,在命令输入如下命令就可改变密码: >.changepass newpass 这样test.db的打开密码就变成了newpass
(3)删除密码恢复为普通数据库 使用如下命令即可将密码消除,这样该数据库又变成了普通数据库,可以用sqlite3命令操作了。 >.changepass |
2,SQLite 数据库加密的一种解决方案
URL: http://www.sqlite.com.cn/MySqlite/3/253.Html
SQLite是一个非常小巧的跨平台嵌入式数据库,它的数据库以文件的形式存放在本地磁盘上,但是在其开源的免费版中它却缺少了一个数据库中几乎是必备的功能,那就是对于数据库的加密。SQLite的数据库文件可以被任何的文本编辑工具打开,从而获取到其中的数据,这一点令很多开发者感到不安。
但是其实SQLite是支持数据库加密的,前些天看到了网友arris的帖子,具体如下: sqlite的源代码中原本就考虑了加密的实现,并且保留了接口sqlite3_key和sqlite3_rekey,只是这两个函数在free版本中没有实现,但幸运的是,sqlite的源代码的代码是开放并允许修改,我们可以很方便的增加加密的实现。在http://www.sqlite.com.cn/POParticle/3/216.Html链接的的代码包中就包含有可加密sqlite的源代码的实现,我根据这个包编译了一个可加密的sqlite。这个包加密实现调用了windows API 的加密函数,所以只能在windows中使用。
这个可加密的版本是在一个ADO.NET 2.0 SQLite Data Provider的基础上改过来的(http://www.sqlite.com.cn/POParticle/3/216.Html),据原作者声称效率损失在千分之一以下。原始工程是基于VS2005的,但是考虑到其普及性还不是很广,所以重新建立了一个居于VC2003的工程。
其实SQLite的两个加密函数使用起来非常的简单,下面分情况说明: ① 给一个未加密的数据库添加密码:如果想要添加密码,则可以在打开数据库文件之后,关闭数据库文件之前的任何时刻调用sqlite3_key函数即可,该函数有三个参数,其中第一个参数为数据库对象,第二个参数是要设定的密码,第三个是密码的长度。例如:sqlite3_key(db,"1q2w3e4r",8); //给数据库设定密码1q2w3e4r ② 读取一个加密数据库中的数据:完成这个任务依然十分简单,你只需要在打开数据库之后,再次调用一下sqlite3_key函数即可,例如,但数据库密码是123456时,你只需要在代码中加入sqlite3_key(db,"123456",6); ① 更改数据库密码:首先你需要使用当前的密码正确的打开数据库,之后你可以调用sqlite3_rekey(db,"112233",6) 来更改数据库密码。 ② 删除密码:也就是把数据库恢复到明文状态。这时你仍然只需要调用sqlite3_rekey函数,并且把该函数的第二个参数置为NULL或者"",或者把第三个参数设为0。
加密后数据库文件显示为乱码:
为此我建立了一个简单的示例: sqlite3 *db; sqlite3_stmt *stat; char *zErrMsg = 0; char temp[256], FileRoot[256]; char buffer2[1024]="0";
sprintf(temp, _T("%s"), _T("utf.db")); CCodingConv::GB2312_2_UTF8(FileRoot, 256, temp, 0); sqlite3_open(FileRoot, &db);
if(db == NULL) { return -1; }
sqlite3_key(db,"1q2w3e4r",8);
sqlite3_exec(db, "CREATE TABLE list (fliename varchar(128) UNIQUE, fzip text);", 0, 0, &zErrMsg); sqlite3_prepare(db, "insert into list values (‘中文GB2312编码‘,?);", -1, &stat, 0);
strcpy(temp, "测试数据UTF-8的支持情况"); int len = (int)strlen(temp);
sqlite3_bind_text(stat, 1, temp, len, NULL); sqlite3_step(stat);
sqlite3_prepare(db, "select * from list;", -1, &stat, 0); sqlite3_step(stat);
const unsigned char * test = sqlite3_column_text(stat, 1); int size = sqlite3_column_bytes(stat, 1);
printf("%s", test);
sqlite3_finalize(stat); //sqlite3_rekey(db,"",0); sqlite3_close(db);
具体的源代码如下:
|
3,SQLite 数据库加密方案
URL: http://blog.chinaunix.net/uid-24800136-id-3299103.html
针对sqlite数据库文件,进行加密。现有两种方案如下 1.对数据库中的数据进行加密。 2.对数据库文件进行加密 两种加密方式的优缺点,比较如下: 一、对数据库中的数据进行加密 优点: 1.实现数据加密快速,只需添加两个方法 一是:对明文数据进行加密返回密文数据 二是:对密文数据进行解密返回明文数据 2.程序无需进行太大变动,仅在对数据进行 添加,修改,删除,查询时。针对指定的表字段 进行修改进行加密,解密的字段即可。 不足: 1.由于对数据进行了加密。所以为了看到明文,必须密文进行解密。 因此会增加处理器的消耗。因终端手机的处理能力有限,可能会出现 处理数据缓慢的现象发生。 2.仅仅对数据进行了加密,还是可以看到数据表的sql语句, 可能猜测到表的作用。另外,如果没有对一个表中的所有字段加密, 则可以看没有加密的明文数据。 需要做的工作: 1.无需考虑平台差异性,qt,android,ios都能快速 的实现。只需在每个平台上,使用各自的语言,实现 同样的加密,解密算法即可。 2.需要对加密算法进行了解,选择一种加密算法,进行实现。 二、对数据库文件进行加密 优点: 1.对整个文件进行了加密,用户通过编辑器看不到任何有用的数据, 用户使用sqlite browser软件也无法打开文件查看数据,保证了数据安全。 2.进行打开数据库时,使用程序sqlite3_key(db,"********",8); 即可对文件解密,对数据表的操作无需进行加密,采用明文即可。 不足: 1.需要修改sqlite的源代码,这个工作难度比较大。 2.需要对修改后的sqlite进行编译,需要对makefile有所了解, 手动编写makefile文件,对源程序进行编译。因平台差异性,可能会造成 某个平台无法编译生成动态链接库的可能。 3.需要对数据访问层代码进行修改,例如qt平台需要将以前对数据库操作使用的 QSqlQuery类,更改为使用sqlite3.h文件中定义操作,对数据库操作。 其他平台也一样,都要做这一步的修改。 4.在程序编译时,要加入使用加密的动态链接库(linux为共享库.so文件) windows平台最容易,只需将所使用的dll文件copy到应用程序中即可。 其他平台需要实验,看如何引入库,如果编译。 需要做的工作: 1.修改sqlite源代码,追加对数据库文件进行加密的功能。 2.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。 3.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。 4.进行程序的部署,测试。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 加密算法的相关知识: 加密技术通常分为两大类:“对称式”和“非对称式”。 对称式加密就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术目前被广泛采用,如美国政府所采用的DES加密标准就是一种典型的“对称式”加密法,它的Session Key长度为56Bits。 非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为“公钥”和“私钥”,它们两个必需配对使用,否则不能打开加密文件。这里的“公钥”是指可以对外公布的,“私钥”则不能,只能由持有人一个人知道。它的优越性就在这里,因为对称式的加密方法如果是在网络上传输加密文件就很难把密钥告诉对方,不管用什么方法都有可能被别窃听到。而非对称式的加密方法有两个密钥,且其中的“公钥”是可以公开的,也就不怕别人知道,收件人解密时只要用自己的私钥即可以,这样就很好地避免了密钥的传输安全性问题。 常见加密算法 DES(Data Encryption Standard):对称算法,数据加密标准,速度较快,适用于加密大量数据的场合; 3DES(Triple DES):是基于DES的对称算法,对一块数据用三个不同的密钥进行三次加密,强度更高; RC2和 RC4:对称算法,用变长密钥对大量数据进行加密,比 DES 快; IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性; RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非对称算法; DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准),严格来说不算加密算法; AES(Advanced Encryption Standard):高级加密标准,对称算法,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法; BLOWFISH,它使用变长的密钥,长度可达448位,运行速度很快; MD5:严格来说不算加密算法,只能说是摘要算法 对MD5算法简要的叙述可以为:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(Bits Length)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。(可参见MD5算法词条) SSF33,SSF28,SCB2(SM1):国家密码局的隐蔽不公开的商用算法,在国内民用和商用的,除这些都不容许使用外,其他的都可以使用; |
4,基于SQLite数据库加密模块的设计与实现
URL: http://www.cnki.com.cn/Article/CJFDTotal-SJSJ200816008.htm
【摘要】:在嵌入式系统的开发设计中,用数据库SQLite对系统的批量数据进行维护管理,可以大大提高程序的运行效率,但SQLite本身没有安全机制的支持。在分析电力系统应用需求,加密系统和SQLite的应用特点,体系结构和开发技术基础上,设计并实现加密模块。结果表明,SQLite增加加密功能后,安全性得以提高。 【作者单位】: 江苏大学计算机科学与通信工程学院; 【关键词】: 嵌入式系统 数据库管理系统 对称加密算法 电力系统 模块 安全机制 加密系统 密钥 设计 安全性 【分类号】:TP309.7 【正文快照】: 0引言电力工业飞速发展,需要处理的数据也在急速的增加,这样势必加大电力系统的负担,电力调度自动化系统的出现成为保证电力系统可靠、稳定运行的主要技术手段,实现对电力系统的自动调度和控制。电力调度自动化系统主要有两部分组成:一部分是主站,另一部分是子站,主站对子站...... NOTE: 在客道巴巴上能够看到完整的原文。 |
5,SQLiteSecure–SQLite的加密扩展方法
URL: http://www.bianceng.cn/database/extra/201001/14336.htm
这篇文章专门介绍如何扩展当前正越来越流行SQLite的数据库的加密部分, SQLite是"一个无须任何配置部署的嵌入式SQL数据库." 下面是本篇文章的目录: ·背景 ·本扩展模块的技术说明书 ·安装和使用 ·下载 ·警告和版权限制 ·鸣谢 ·相关法律说明 背景 我为什么要写这个扩展? 为了满足我自己的一些疯狂的想法.:) 好了,不开玩笑了.不久前我想写一个程序用来存储一些私人信息 (我自己的一个项目).我不想用那些很大的开源数据库,例如MySQL,因为它们确实是太大了,需要占用很大的空间,而且要单独的安装部署.后来我发现了SQLite, 它非常的小巧而且运行起来很快,并且它的API函数十分的简单,在我的C++程序当中可以很方便的使用.就是有一个问题,大概是由于它要保持简单所以它不支持任何的验证和加密.这令我一点安全感都没有. 因此我开始寻找SQLite的加密解决方案.我找到了两个,但是它们都是商业软件.SQLite的作者, D.Richard Hipp先生提供了一个可以对数据库文件进行完全加密SQLite的加强版本.也就是那个叫做SQLcrypt(tm)的商业软件, 它实现了数据存储层的透明加密.不幸的是它们对于我们这些普通人来说都太贵了, 尤其是对于我这种非商业目的只是想用SQLite开发一些小应用自己玩的人来说更是如此.然而我却是非常的需要对数据库进行加密- 在数据库层对整个数据库文件进行透明的加密.所有的开发者和用户只需要在打开数据库的时候提供密码就可以了.然后接下来的事情就全都交给数据库去做了.这种方式将比那种在数据和字段上的加密要容易的多,也方便的多, 不然需要加密的字段就都要设计成BLOB或者string类型了. 在我搜索了SQLite的邮件列表和在Google上搜索免费的SQLite插件或扩展之后,我发现没有能够满足我的需求的, 所以我决定自己写一个.我从SQLite的作者预留的一些用来支持数据库加密解密的API接口获得了灵感,并且我发现实际上也有人写了一个基于SQLite的加密库(SQLcrypt).我花费了几天的时间来研究一些加密的算法,我要选出一种使用(The AES (Rijndael) block cipher) ,另外还有就是如何生成密码, 当然最重要的就是我怎样才能把我用来完成加密解密数据库的代码嵌入SQLite的核心当中执行. 扩展模块的技术说明书 这个扩展模块的结构相当的简单.大体上来说我编写了SQLite代码中已经提供了原型的四个函数: sqlite3_key(), sqlite3_rekey(), sqlite3CodecGetKey(), 和 sqlite3CodecAttach().前两个函数是在sqlite3.h头文件中定义的公共API.另外两个定义在 attach.c 的sqlite3Attach()函数中.我阅读了它的源代码中提供的函数原形(主要是 pager.c 和 btree.c两个文件),看一下它们是如何工作的.我发现实现他们并不困难,因为对数据库加密解密的机制已经都实现了(感谢 Richard!). 这个扩展的其他部分就是写一个用来加密和解密的程序.为此我使用了AES加密算法,其中代码的关键部分取自Brian Gladman (his site) 还有David Ireland的高精度加密算法库BigDigits.因为我不想在一开始的时候就跟SQLite的数据库格式过多的纠缠, 所以我用了计数器模式(CTR)把AES加密块转换成256字节的加密流.这样加密之后的密文就可以和原来的明文有相同的长度,加密和没加密的数据库文件尺寸相同 (也就是说不需要保存而外的信息).我还使用了Brian Gladman网站上提供的 PKCS#5签名的SHA256算法从用户提供的密码中来生成AES 算法的密钥.如果是这样的话, 我就要写很多的代码来处理salt value 才能避免往数据库中存入额外的信息. Pager结构体用来存放指向编码函数的指针, 用来从数据库中加密或解密数据.我写了这些代码用来加密或解密数据库中的记录.因为我使用了计数器(CTR)模式,加密和解密用的是相同的算法,所以简单了许多.但是我还是需要初始化一个进程的计数器.我把数据库切分成了一个一个的块,每个都作为一个单独的AES加密块 (例如默认的情况下是16字节).每个块都从0开始编号.依据传入编码函数的page size和page number参数, 我算出计数块内的计数值 (等于块的编号) 和偏移量 (具体实现请看代码),然后用它来初始化加密流. 安装和使用 警告: 目前的代码还在试验当中.因此我很希望大家来帮我测试这些代码 (因为我没有那么多的时间和数据去进行测试), 使用的风险需要你自己去承担. 如果要使用这个扩展模块你需要下载修改过的SQLite和BigDigits库,然后自己编译它们.我只是在Win32系统下用MinGW compiler编译并测试过.但是我认为它在*nix系统下也能正常工作.如果你要使用MinGW, 你需要下载最新版MinGW的和M-sys .我是用gcc 3.4.2编译的. BigDigits高精度算法库可以从这里下载, 我自己写了一个Makefile 文件用MinGW把它编译成了一个静态的库文件.下载包里有编译好的BigDigits库文件.(bigdigits.h 和libbdmpa.a) 如果你想要自己编译,请遵循以下步骤: 1.从上面的地址下载源代码. 2.解压到一个目录里. 3.下载并保存‘Makelib.mak‘文件到刚才的目录. 4.修改头文件中最开始的一些 #define‘s和typedef‘s使之适合你的操作系统. 5.在命令行中输入‘make -f Makelib.mak‘编译源代码. 6.把编译出来的libbdmpa.a文件和bigdigits.h头文件拷贝到SQLite的顶层目录下. 对于Linux/Unix和MinGW的用户, 你只需要按照通常的步骤去做就可以 ./configure make make install 把SQLiteSecure编译了(包括配置和安装).编译出来的库文件和命令行可执行文件和原始的SQLite基本相同,除了前面加上了‘sec‘前缀,从而避免和你之前使用的SQLite命名冲突. 注意: **请** 不要问我如何用VC++或者其他编译其编译源代码.以为我不用,所以不知道. 你可以用的命令行sqlite3sec工具来先体验一下SQLiteSecure.打开一个普通的数据库文件, 输入 $ sqlite3sec a.db 打开一个加密的数据库文件, 输入 $ sqlite3sec -key "your passphrase" b.db 在sqlite3sec中你可以使用下列三种方法来添加一个加密的数据库: sqlite> ATTACH ‘b.db‘ AS b; sqlite> ATTACH ‘b.db‘ AS b KEY ‘your passphrase‘; sqlite> ATTACH ‘b.db‘ AS b KEY blob; 第一种方法使用和主数据库相同的密码(或者是没有密码) , 第二种方法用你输入的短语来做密码.第三种方法假设你用BLOB的十六进制值作为密码(例如 f03d69ac3981...).不过我还没有充分的测试这个使用BLOB作为密码的版本.请注意:如果你的主数据库是加密的,然后你想添加一个不加密的数据库,这种情况下你需要用第二种方法然后传递一个空字符串(‘‘)作为密码. 在sqlite3sec中你还可以用.rekey命令来改变数据库的密码,但是这个我目前还没有写完,如果调用的话会返回一个错误.;) API方法, 如果你需要加密一个数据库,你仅仅需要从用户或者其他的地方得到设置的密码, 然后在sqlite3_open() 或者 sqlite3_open16()函数之后,在调用其他的sqlite3函数之前调用sqlite3_key()函数。 函数举例: sqlite3 *db; ... sqlite3_open(DbFilename, &db); sqlite3_key(db, zKey, strlen(zKey)); ... 之前提到过re-key函数目前还不能工作,所以如果你调用了sqlite3_rekey()将会直接返回一个错误. 下载 下载包中包含了SQLiteSecure的源代码和编译好的BigDigits库文件.最省事的方法就是不改任何东西,直接解压缩以后先运行./configure, 然后运行make.如果Makefile文件有问题请告诉我一下.但是除了GNU编译器(MinGW 或者 Linux)之外我无法提供其他系统的技术支持. SQLiteSecure source in .tar.gz format:http://www.voidbrain.com/sqlitesec/sqlite3sec-alpha.tar.gz SQLiteSecure source in ZIP format:http://www.voidbrain.com/sqlitesec/sqlite3sec-alpha.zip 警告和限制 ·我没有用tcl测试过这个库. ·我没有在实际的数据或者程序中测试这个库,也没有用一些特殊用例来测试. ·因为这个版本还没有实现更改密码.所以如果你想要更改密码,你需要导出加密的数据库到一个新的数据库当中(没有密码或者设置新的密码): $ sqlite3sec -key "cur pwd" a.db .dump | sqlite3sec b.db 或者 $ sqlite3sec -key "cur pwd" a.db .dump | sqlite3sec -key "new pwd" b.db 我要声明我并不是一个加密学的专家, 所以在设计和实现加密层的时候难免会存在安全漏洞.因此大家一定要明白我设计的这个扩展模块只是打算用在握自己的个人工程当中,对于安全性的要求远低于一般的商业产品的标准. ·最后你一定要记住它还不是一个完整的版本,它还在测试当中。 具体的实现请阅读src/sec_ext目录下的代码.你可以用我名字的大写缩写(LWL)来搜索我对于原始代码的改动.如果你对代码的实现有任何的意见或建议欢迎你反馈给我.当然它确实还有很大的提升空间. 鸣谢 向以下人致谢: ·D Richard Hipp for his SQLite library ·Brian Gladman for his AES and key derivation code ·David Ireland for his BigDigits multiple-precision arithmetic library ·Everyone who helped test and gave feedback, comments, and suggestions 法律声明 为了避免其他和我有同样需求的人重新发明轮子,我最终把代码开源了.但是我也说过了,这个扩展模块目前还是试验阶段,你可以使用或者修改代码来适合你的程序, 但是请在源代码中保留我的名字,另外在你的程序或者文档中也请注明我的付出. 但是如果你非不遵守这些约定,我也不会以法律的形式去起诉你,不会做任何对你本人,你的硬件产品,客户端程序,公司,个人名誉或者其他任何和使用这个软件相关的东西做有害的事情.你也不是非要使用它不可, 你用了这个试验性的扩展模块就要考虑到它可能有bug,我对于这些bug造成的损失不负任何的责任.源代码已经提供给你浏览和审查了,我只能是担保我没有故意写任何破坏你的系统的代码.所以如果你编译运行这个代码,一切风险自负. 欢迎大家提出建议和意见来帮助我改进代码,同时也可以发送给我代码的修正或者片段.我把这当作是一个学习的机会,所以我很期待好的建议或反馈. 我认为我的代码没有任何地方违反了别人的版权或协议.如果你发现有请通知我,我将去掉那些违反的地方. |
6,cocos2d-x 下使用加密 sqlite3
URL: http://blog.csdn.net/kerwin_zxc/article/details/7693139
sqlite3 加密库用的是wxsqlite3-3.0.0.1提取出来的, 在win32 , android 下测试通过,无异常。 编译时只需要编译 sqlite3secure.c 此文件,即可以成功,测试时生成静态库文件。 以下是android 下编译过程: LOCAL_PATH := $(call my-dir)
|
7,iOS开发-sqlite数据库加密的两种方法+例子
URL:http://download.csdn.net/detail/youngshook/4043540
还没有下载下来学习 |
另外,我还简单分析了SQLCipher和wxsqlite3,发现直接拿过来用还是不行。但是,至此,基本有了思路:可以把这些开放源码的工程中的加密和解密代码整理出来供我们自己使用(很可能有平台依赖性,但是这没有关系)。
也就是说,利用sqilte中虽然没有实现但已经提供的两个接口:sqlite3_key和sqlite3_rekey. 实现自己的这两个函数即可---只是要肯一点机密解密相关代码了。
本文出自 “青峰” 博客,请务必保留此出处http://zhuxianzhong.blog.51cto.com/157061/1440561
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。