SQLite是一个轻量的
、跨平台的
、开源的
数据库引擎,它的在读写效率
、消耗总量
、延迟时间
和整体简单性上
具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。
然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。比如国内某团购iOS客户端的DB缓存数据就一览无余:
对数据库加密的思路有两种:
这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。
不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。
将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。
目前网上查询到iOS平台可用的SQLite加密工具有以下几种:
事实上SQLite有加解密接口,只是免费版本没有实现而已。而SQLite Encryption Extension (SEE)
是SQLite的加密版本,提供以下加密方式:
1 2 3 4 |
|
SQLite Encryption Extension (SEE)版本是收费的。
使用AES加密,其原理是实现了开源免费版SQLite没有实现的加密相关接口。
SQLiteEncrypt
是收费的。
使用256-bit AES加密,其原理和SQLiteEncrypt一样,都是实现了SQLite的加密相关接口。
SQLiteCrypt
也是收费的。
首先需要说明的是,SQLCipher
是完全开源的,代码托管在github上。
SQLCipher
使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,但也增加了一些自己的接口,详情见这里。
SQLCipher
分为收费版本和免费版本,官网介绍的区别为:
1 2 3 |
|
只是集成起来更简单,不用再添加OpenSSL
依赖库,而且编译速度更快,从功能上来说没有任何区别。仅仅为了上述一点便利去花费几百美刀,对于我等苦逼RD来说太不值了,还好有一个免费版本。
鉴于上述SQLite加密工具中,只有SQLCiper
有免费版本,下面将将着重介绍下SQLCiper
。
在项目中集成免费版的SQLCipher
略显复杂,还好官网以图文的方式介绍的非常详细,集成过程请参考官网教程。
下面这段代码来自官网,其作用是使用SQLCipher创建一个新的加密数据库,或者打开一个使用SQLCipher创建的数据库。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
需要注意的是,在使用sqlite3_open
打开或创建一个数据库,在对数据库做任何其它操作之前,都必须先使用sqlite3_key
输入密码,否则会导致数据库操作失败,报出sqlite错误码SQLITE_NOTADB
。
在sqlite3_open
打开数据库成功,而且用sqlite3_key
输入密码以后,就可以正常的对数据库进行增、删、改、查等操作了。
SQLCipher提供了sqlcipher_export()
函数,该函数可以方便的对一个普通数据库导入到SQLCipher加密加密的数据库中,操作方式如下:
1 2 3 4 |
|
sqlcipher_export()
函数同样可以将SQLCipher加密后的数据库内容导入到未加密的数据库中,从而实现解密,操作方式如下:
1 2 3 4 5 |
|
总体来说,SQLCipher是一个使用方便,灵活性高的数据库加密工具。
另外,我写了个SQLCipherDemo工程放到了CSDN上,有需要的同学请自行下载。
The SQLite Encryption Extension (SEE)
SQLiteEncrypt
SQLiteCrypt
SQLite with encryption/password protection
SQLCipher