设为首页 收藏本站
查看: 1305|回复: 0

[经验分享] SQLite加密

[复制链接]

尚未签到

发表于 2016-11-28 10:40:19 | 显示全部楼层 |阅读模式

关于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的加密版本,提供以下加密方式:


  • RC4
  • AES-128inOFBmode
  • AES-128inCCMmode
  • AES-256inOFBmode



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创建的数据库。


  • NSString*databasePath=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0]
  • stringByAppendingPathComponent:@"cipher.db"];
  • sqlite3*db;
  • if(sqlite3_open([databasePathUTF8String],&db)==SQLITE_OK){
  • constchar*key=[@"BIGSecret"UTF8String];
  • sqlite3_key(db,key,strlen(key));
  • intresult=sqlite3_exec(db,(constchar*)"SELECTcount(*)FROMsqlite_master;",NULL,NULL,NULL);
  • if(result==SQLITE_OK){
  • NSLog(@"passwordiscorrect,or,databasehasbeeninitialized");
  • }else{
  • NSLog(@"incorrectpassword!errCode:%d",result);
  • }

  • sqlite3_close(db);
  • }



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



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



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


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


  • $./sqlcipherplaintext.db
  • sqlite>ATTACHDATABASE'encrypted.db'ASencryptedKEY'testkey';
  • sqlite>SELECTsqlcipher_export('encrypted');
  • sqlite>DETACHDATABASEencrypted;



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


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


  • $./sqlcipherencrypted.db
  • sqlite>PRAGMAkey='testkey';
  • sqlite>ATTACHDATABASE'plaintext.db'ASplaintextKEY'';--emptykeywilldisableencryption
  • sqlite>SELECTsqlcipher_export('plaintext');
  • sqlite>DETACHDATABASEplaintext;



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



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



参考文档


The SQLite Encryption Extension (SEE)




SQLiteEncrypt




SQLiteCrypt




SQLite
with encryption/password protection





SQLCipher

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-306582-1-1.html 上篇帖子: sqlite要点 下篇帖子: 1、 Sqlite
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表