08-sqlite 加密

关于SQLite

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

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

SQLite加密方式

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

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

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

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

2. 对数据库文件加密

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

SQLite加密工具

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

SQLite Encryption Extension (SEE)

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

  1. RC4
  2. AES-128 in OFB mode
  3. AES-128 in CCM mode
  4. AES-256 in OFB mode

SQLite Encryption Extension (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创建的数据库。

  1. NSString *databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
  2. stringByAppendingPathComponent: @"cipher.db"];
  3. sqlite3 *db;
  4. if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
  5. const char* key = [@"BIGSecret" UTF8String];
  6. sqlite3_key(db, key, strlen(key));
  7. int result = sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL);
  8. if (result == SQLITE_OK) {
  9. NSLog(@"password is correct, or, database has been initialized");
  10. } else {
  11. NSLog(@"incorrect password! errCode:%d",result);
  12. }
  13. sqlite3_close(db);
  14. }

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

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

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

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

  1. $ ./sqlcipher plaintext.db
  2. sqlite> ATTACH DATABASE ‘encrypted.db‘ AS encrypted KEY ‘testkey‘;
  3. sqlite> SELECT sqlcipher_export(‘encrypted‘);
  4. sqlite> DETACH DATABASE encrypted;

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

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

  1. $ ./sqlcipher encrypted.db
  2. sqlite> PRAGMA key = ‘testkey‘;
  3. sqlite> ATTACH DATABASE ‘plaintext.db‘ AS plaintext KEY ‘‘; -- empty key will disable encryption
  4. sqlite> SELECT sqlcipher_export(‘plaintext‘);
  5. sqlite> DETACH DATABASE plaintext;

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

另外,我写了个SQLCipherDemo工程放到了CSDN上,有需要的同学请自行下载。

参考文档

 

时间: 2025-01-13 19:46:03

08-sqlite 加密的相关文章

SQLite 加密 -- SQLCipher

SQLite3 插件 github 下载地址 插件配置步骤地址 购买地址 其他加密方式介绍 SQLCipher API 地址 前言 应用使用 SQLite 来存储数据,很多时候需要对一部分的数据进行加密.常见的做法是对要存储的内容加密后存到数据库中,使用的时候对数据进行解密.这样就会有大量的性能消耗在数据的加密解密上. SQLite 本身是支持加密功能的 (免费版本不提供加密功能,商业版本是支持加密模块).SQLCipher 是一个开源的 SQLite 加密的扩展,支持对 db 文件进行 256

SQLite加密方式 [转]

关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). 然而免费版的SQLite有一个致命缺点:不支持加密.这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到. SQLite加密方式 对数据库加密的思路有两种: 1. 将内容加密后再写入数据库 这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸

iOS SQLite加密之SQLCipher

至于SQLCipher,我就不多说了,百度一下,你就知道.公司的iOS APP要给SQLite,今天就上网查了些资料,做了下整理,主要参考SQLCipher的官方集成文档,有不妥之处大家提出来我再改进,感谢拍砖.官方集成文档:https://www.zetetic.net/sqlcipher/ios-tutorial/. Prerequisites 安装Xcode开发环境,不用多说了吧. OpenSSL 本教程用苹果提供的FrameWork:CommonCrypto,可在工程,Target,Bu

Android数据库(sqlite)加密方案

最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那下一步就是怎样做成SDK去方便使用?第一个念头就是将原生的数据库使用方式移植过来,但做起来比开始想像的难了点,但最终也在修修补补中完

【转】Android SQLite加密

原文地址:http://blog.csdn.net/feifei454498130/article/details/8843402 最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那

sqlite的源代码加密,以及其它一些文章

一.       给数据库加密 前面所说的内容网上已经有很多资料,虽然比较零散,但是花点时间也还是可以找到的.现在要说的这个——数据库加密,资料就很难找.也可能是我操作水平不够,找不到对应资料.但不管这样,我还是通过网上能找到的很有限的资料,探索出了给sqlite数据库加密的完整步骤. 这里要提一下,虽然 sqlite 很好用,速度快.体积小巧.但是它保存的文件却是明文的.若不信可以用 NotePad 打开数据库文件瞧瞧,里面 insert 的内容几乎一览无余.这样赤裸裸的展现自己,可不是我们的

cocos2d-x 2.1 Win32+Android开发中的sqlite数据库加密技术探讨

注意:本博客转移自本人约一年前的ITPUB博客文章,为的是便于学员参考之用. 很显然,cocos2d-x编程中只了解基本的sqlite数据库操作技术只是一个开头,真正把此数据库数据应用于实际中不使用一定的加密及解密技术几乎是不行的. 这个问题尽早会来到我面前,这不?现在就来了.一开始,自然想使用最省工的了:但是,这样的好事并不多,极少极少...... 于是,我先搜罗了一些现成的文章拿来一阅. 1,Sqlite数据库加密解密 SRC: http://blog.sina.com.cn/s/blog_

SQLite XXTea加密学习

这几天优化数据库读写,移植了xxtea加密到最新的数据库sqlite 3.12.2里,一些好文章放在这里.移植后,数据库读写性能异常优秀! 这几天又发现,数据库还是发生了无法写入情况,数据库崩溃掉了.所以,估计想兼容以前数据库是很困难的了.. 十分推荐他的博客:SQLite学习笔记(十)&&加密    Sqlite学习笔记(一)&&编译安装 sqlite3.6.18加密模块change(讨论) sqlite3 加解密 SQLITE3 加密总结 sqlite3+使用总结 SQ

android sqlite 升级为加密

主要部分的核心代码. (SQLiteDatabase db) {     createTable(db)List<ShopCartGoodsEntity> oldList = .().queryAllIntenerl()(oldList != && !oldList.isEmpty()) {insertMultiterm(dboldList).().deleteAll()} } 网上看到的文章都是,项目全新首次使用android sqlite加密,已经很多很完整了,调试下就可以

加密你的SQLite

转自王中周的个人博客 关于SQLite SQLite是一个轻量的.跨平台的.开源的数据库引擎,它的在读写效率.消耗总量.延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS.Android). 然而免费版的SQLite有一个致命缺点:不支持加密.这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到.比如国内某团购iOS客户端的DB缓存数据就一览无余: SQLite加密方式 对数据库加密的思路有两种: 1. 将内容加密后再写入数据库 这种方式使用简单,