`
wangleifire
  • 浏览: 500831 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQLite 数据库加密的一种解决方案

    博客分类:
  • c#
阅读更多

SQLite 数据库加密的一种解决方案

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); 

 

具体的源代码如下:

SQLite3.3.7 加密版源代码(VC2003

SQLite3.3.7 加密版源代码(VC2005

分享到:
评论
1 楼 Aaron-Joe-William 2017-06-01  
文件被删除了。下不了。

相关推荐

    sqlite3fish:SQLite3 的另一种加密解决方案(使用 Blowfish 算法)-开源

    sqlite3fish 是另一种用于 sqlite3 的加密解决方案。 它基于 botansqlite3(https://github.com/OlivierJG/botansqlite3) 的一些源代码。 但它不需要 Botan 库,它使用 Blowfish 算法来加密/解密数据库文件。 该库仅...

    Android数据库安全解决方案,使用SQLCipher进行加解密

    我们都知道,Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作。数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧。在Android中,...

    Menotexport:从Mendeley库导出注释的Python解决方案

    Menotexport Menotexport(Mendeley-Note-Export)从Mendeley数据库中提取和导出突出显示,注释和PDF 重要的提示: ...在我们找出一种容易绕过的方法之前,请考虑备份您的数据库文件,并尝试使用1

    santedb-orm:SanteDB高性能对象关系模型

    该团队研究了几种轻量级的ORM解决方案,但是这些解决方案是: 不支持LINQ 没有提供简单的方法来手动覆盖常见的查询模式没有提供表达外键关系和/或特殊列(加密,索引等)的机制SanteDB-ORM没有提供用于重建数据库的...

    火车浏览器 v7.3.zip

    软件可以读取写入mysql,sqlserver,sqlite,access四种数据库,可以通过设置脚本,达到自动登录,识别验证码,自动抓取数据,自动提交数据,点击网页,下载文件,操作数据库,收发邮件等操作。还可以使用逻辑操作,...

    重写NSUserDefault

    首先笔者想谈得还是数据库,数据库已不是什么先锋技术,但是依然是众多解决方案中开发成本较高的方案,毕竟,在业内的开发实践,也只有数据库会需要独立一类工种——“DB工程师”来支持相关的开发工作。其次是文件,...

    asp.net知识库

    .NET20 一种简单的窗口控件UI状态控制方法 翻译MSDN文章 —— 泛型FAQ:最佳实践 Visual C# 3.0 新特性概览 C# 2.0会给我们带来什么 泛型技巧系列:如何提供类型参数之间的转换 C#2.0 - Object Pool 简单实现 ...

    php网络开发完全手册

    15.5 常见问题与解决方案 259 15.6 小结 261 第16章 数据库中的程序逻辑 262 16.1 数据库程序逻辑与PHP程序逻辑的分体 16.1 设计原则 262 16.2 数据库中的程序逻辑与数据的关系 262 16.3 存储过程的设计 263 16.3.1 ...

    易语言程序免安装版下载

    修改BUG:Sqlite3数据库支持库中“Sqlite数据库.取错误文本()”返回的文本是UTF-8编码(应是GB18030编码)。 -------------------------------------------------------------------------------- 易语言5.0 相...

Global site tag (gtag.js) - Google Analytics