关于sqlite

sqlite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。

然而免费版的sqlite有一个致命缺点:不支持加密。这就导致存储在sqlite中的数据可以被任何人用任何文本编辑器查看到。比如国内某团购iOS客户端的DB缓存数据就一览无余:

sqlite加密方式

对数据库加密的思路有两种:

1.将内容加密后再写入数据库

这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。

不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。

2.

将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的sqlite加密基本都是通过这种方式实现的。

sqlite加密工具

目前网上查询到iOS平台可用的sqlite加密工具有以下几种:

sqlite EncryptionExtension (SEE)

事实上sqlite有加解密接口,只是免费版本没有实现而已。而sqlite Encryption Extension (SEE)是sqlite的加密版本,提供以下加密方式:

RC4

AES-128 inOFB mode

AES-128 inCCM mode

AES-256 inOFB mode

sqlite EncryptionExtension (SEE)版本是收费的。

sqliteEncrypt

使用AES加密,其原理是实现了开源免费版sqlite没有实现的加密相关接口。

sqliteEncrypt是收费的。

sqliteCrypt

使用256-bit AES加密,其原理和sqliteEncrypt一样,都是实现了sqlite的加密相关接口。

sqliteCrypt也是收费的。

sqlCipher

首先需要说明的是,sqlCipher是完全开源的,代码托管在Github上。

sqlCipher使用256-bit AES加密,由于其基于免费版的sqlite,主要的加密接口和sqlite是相同的,但也增加了一些自己的接口,详情见这里。

sqlCipher分为收费版本和免费版本,官网介绍的区别为:

asier to setup,saving many steps in project configuration

pre-built with a modern version of OpenSSL,avoiding another external dependency

much faster for each build cycle because the library doesn't need to be built from scratch on each compile (build time can be up to 95% faster with the static libraries)

只是集成起来更简单,不用再添加OpenSSL依赖库,而且编译速度更快,从功能上来说没有任何区别。仅仅为了上述一点便利去花费几百美刀,对于我等苦逼RD来说太不值了,还好有一个免费版本。

鉴于上述sqlite加密工具中,只有sqlCiper有免费版本,下面将将着重介绍下sqlCiper。

在项目中使用sqlCipher

在项目中集成免费版的sqlCipher略显复杂,还好官网以图文的方式介绍的非常详细,集成过程请参考官网教程。

使用sqlCipher初始化数据库

下面这段代码来自官网,其作用是使用sqlCipher创建一个新的加密数据库,或者打开一个使用sqlCipher创建的数据库。

NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0]

stringByAppendingPathComponent: @"cipher.db"];

sqlite3 *db;

if(sqlite3_open([databasePath UTF8String],&db) == sqlITE_OK) {

constchar* key = [@"BIGSecret"UTF8String];

sqlite3_key(db,key,strlen(key));

intresult = sqlite3_exec(db,(char*)"SELECT count(*) FROM sqlite_master;",NULL,NULL);

if(result == sqlITE_OK) {

NSLog(@"password is correct,or,database has been initialized");

} else{

NSLog(@"incorrect password! errCode:%d",result);

}

sqlite3_close(db);

}

需要注意的是,在使用sqlite3_open打开或创建一个数据库,在对数据库做任何其它操作之前,都必须先使用sqlite3_key输入密码,否则会导致数据库操作失败,报出sqlitesqlITE_NOTADB。

在sqlite3_open打开数据库成功,而且用sqlite3_key输入密码以后,就可以正常的对数据库进行增、删、改、查等操作了。

使用sqlCipher加密已存在的数据库

sqlCipher提供了sqlcipher_export()函数,该函数可以方便的对一个普通数据库导入到sqlCipher加密加密的数据库中,操作方式如下:

$ ./sqlcipher plaintext.db

sqlite> ATTACH DATABASE 'encrypted.db'AS encrypted KEY'testkey';

sqlite> SELECT sqlcipher_export('encrypted');

sqlite> DETACH DATABASE encrypted;

解除使用sqlCipher加密的数据库密码

sqlcipher_export()函数同样可以将sqlCipher加密后的数据库内容导入到未加密的数据库中,从而实现解密,操作方式如下:

$ ./sqlcipher encrypted.db

sqlite> PRAGMA key = 'testkey';

sqlite> ATTACH DATABASE 'plaintext.db'AS plaintext KEY''; -- empty key will disable encryption

sqlite> SELECT sqlcipher_export('plaintext');

sqlite> DETACH DATABASE plaintext;

总体来说,sqlCipher是一个使用方便,灵活性高的数据库加密工具。

-------------------------------------

如果这篇文章对您或您的朋友有所帮助,您可以点击右上角的更多按钮

分享给您的朋友们~

CocoaChina是全球最大的苹果开发中文社区,它的官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及cocos2d引擎、cocostudio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态!

请搜索微信号“CocoaChina”关注我们

php读取加密sqlite,加密你的SQLite相关推荐

  1. android sqlite加密数据库,Android Sqlite数据库加密

    Android使用的是开源的SQLite数据库,数据库本身没有加密,加密思路通常有两个: 1. 对几个关键的字段使用加密算法,再存入数据库 2. 对整个数据库进行加密 SQLite数据库加密工具: 收 ...

  2. Delphi如何使用HooKAPI的方式获取SQLITE加密数据库密码

    破解原理:加密过的SQLITE数据库,调用sqlite3_open函数后,会调用sqlite3_key函数进行密码设置,此时通过Hook sqlite3.dll中sqlite3_key函数获取数据库密 ...

  3. 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)

    读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...

  4. 读取excel文件数据,插入sqlite,在dataGridView读取显示

    读取excel文件数据,插入sqlite,在dataGridView读取显示 布局 将读取的文件excel 以及sqlite小型数据库位置(在项目文件下/bin/debug/-DB) 直接上代码 测试

  5. ios php mysql数据库_IOS_iOS中SQLite使用教程,SQLite,是一款轻型的数据库, - phpStudy...

    iOS中SQLite使用教程 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中 ...

  6. 【C 语言】文件操作 ( 文件加密解密 | 加密文件 )

    文章目录 一.文件加密解密操作 1.加密整 4096 字节的数据 2.加密小于 4096 字节的数据 二.完整代码示例 1.文件加密操作 2.DES 加密解密头文件 3.第三方 DES 加密解密函数库 ...

  7. 代码加密:加密Java源代码,保护自己的版权!

    内容: 一.为什么要加密? 二.定制类装入器 三.加密.解密 四.应用实例 五.注意事项 Java程序的源代码很容易被别人偷看.只要有一个反编译器,任何人都可以分析别人的代码.本文讨论如何在不修改原有 ...

  8. Java文件操作大全(包括文件加密,String加密)

    1.创建文件夹 //import java.io.*; File myFolderPath = new File(%%1); try { if (!myFolderPath.exists()) myF ...

  9. SQLite之C#连接SQLite

    SQLite之C#连接SQLite 2015-05-05 17:52  糯米粥  阅读(40651)  评论(1)  编辑  收藏 我的程序突然不能访问数据库了,回过头来再看这文章,才知道是自己的几天 ...

最新文章

  1. 网站运营活动总结报告模板
  2. mysql三范式_MySQL设计之三范式的理解
  3. 下列标识中不是c语言保留字,下列标识符中,不是 C 语言保留字的是
  4. @计算机专业大学生,毕业后如何明确自己的职业方向,该走那条路?
  5. 《WinForm开发系列之控件篇》Item3 BindingSource (暂无)
  6. 范文杰 201421410010 作业2
  7. linux高级技巧:rsync同步(二)
  8. JAVA Json数组转换List实体对象
  9. 戴尔计算机无法安装Win10,示例戴尔无法开机如何重装win10
  10. python毕业设计作品基于django框架 教室图书馆座位预约系统毕设成品(6)开题答辩PPT
  11. 会员管理系统html,会员管理系统网页版
  12. 神仙代码静态测试工具 Helix QAC 2022.3中的新增功能
  13. NLP的巨人肩膀[转]
  14. /deep/在chrome89+中出现样式混乱的问题
  15. disallow root login remotely 不起作用?
  16. 数据集成解决方案探讨
  17. 中国跨5个时区,东南西北的极点坐标信息
  18. SpringBoot学习之zookeeper、dubbo入门项目实战(七)
  19. http、https 等 常用默认端口号
  20. SourceTree的简单使用

热门文章

  1. Elastic 社区资深布道师,分享也是一种快乐
  2. 资深技术布道师的 5 个秘密武器
  3. 架构师接龙:黄冬邓毅
  4. 智能家居系统各个硬件模块功能代码实现
  5. “自动修复”无法修复你的电脑-SATAFIRM S11-固态硬盘坏了
  6. Linksys WRT路由器刷入OpenWrt与原厂固件双固件及切换
  7. 《喜欢你我也是》最精致程序员上线!
  8. win怎么在计算机里按日期搜索文件,win10系统如何按指定修改日期搜索文件
  9. 第3章 内核编程语言与环境(2)
  10. php dt dd,DL.DT.DD实现左右的布局简单例子