关于SQLite

SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整体简单性上具有的优越性,使其成为移动平台数据库的最佳解决方案(如iOS、Android)。
 
然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。
 
SQLite加密方式
对数据库加密的思路有两种:
 
1. 将内容加密后再写入数据库
这种方式使用简单,在入库/出库只需要将字段做对应的加解密操作即可,一定程度上解决了将数据赤裸裸暴露的问题。
 
不过这种方式并不是彻底的加密,因为数据库的表结构等信息还是能被查看到。另外写入数据库的内容加密后,搜索也是个问题。
 
2. 对数据库文件加密
将整个数据库整个文件加密,这种方式基本上能解决数据库的信息安全问题。目前已有的SQLite加密基本都是通过这种方式实现的。
 
SQLite加密工具
目前网上查询到iOS平台可用的SQLite加密工具有以下几种:
 
事实上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)版本是收费的。
 
使用AES加密,其原理是实现了开源免费版SQLite没有实现的加密相关接口。
 
SQLiteEncrypt是收费的。
 
使用256-bit AES加密,其原理和SQLiteEncrypt一样,都是实现了SQLite的加密相关接口。
 
SQLiteCrypt也是收费的。
 
首先需要说明的是,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上,有需要的同学请自行下载。
 
参考文档
 
 
 
 
 
 
打个广告,帮忙关注一下,只需要关注就行,不要取关哦。。。。
 

SQLite加密方式 [转]的更多相关文章

  1. SQLite加密 wxSqlite3

    一直在网上搜wxSqlite3的文档,但是总找不到能真正解决问题的,就是一个简单的编译wxSqlite3自带的示例也出了老多问题,后来却发现,其实wxSqlite3的readme中已经有了详细的方法, ...

  2. SQLite 加密 -- SQLCipher

    SQLite3 插件 github 下载地址 插件配置步骤地址 购买地址 其他加密方式介绍 SQLCipher API 地址 前言 应用使用 SQLite 来存储数据,很多时候需要对一部分的数据进行加 ...

  3. iOS代码加密常用加密方式

    iOS代码加密常用加密方式 iOS代码加密常用加密方式,常见的iOS代码加密常用加密方式算法包括MD5加密.AES加密.BASE64加密,三大算法iOS代码加密是如何进行加密的,且看下文 MD5 iO ...

  4. Android数据库(sqlite)加密方案

    最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...

  5. iOS常用的加密方式--备用

    MD5 iOS代码加密 创建MD5类,代码如下 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSStri ...

  6. iOS常用的加密方式

    MD5 iOS代码加密 创建MD5类,代码如下 #import <Foundation/Foundation.h> @interface CJMD5 : NSObject +(NSStri ...

  7. iOS加密方式及解压缩文件

    Base64加密方式 Base64是一种加密方法,可逆的加密. Base64中的可打印字符包括字母A-Z.a-z.数字0-9,这样共有62个字符./ + 填充 = echo -n BC|base64 ...

  8. Dr.com──加密方式(网页端)

    Dr.com是城市热点公司开发的宽带计费系统,可以控制网络进行管理,认证,计费,限速……许多的高校与企业都有使用. 从接触到drcom就很感兴趣(原因想必大家都懂...) drcom登陆(认证)方式又 ...

  9. Ecstore会员密码加密方式破解

    <?php //以下是加密方式,亲测有效 $string_md5 = md5(md5("密码")."用户名"."注册时间");//三个 ...

随机推荐

  1. 当碰到需要调试打包后的js

    在react中经常开发碰到不能热更中进行调试的,如IE之类的 这个时候我们就需要打包才能运行看到效果, 但是往往每次打包都需要很长的时间: 这个时候我们就可以直接找到打包后的文件,直接在改文件中修改: ...

  2. JS(微信小程序)处理银行卡号

    其实这是一个小程序的项目,但是JS还是那个JS 在本项目中要实现两种效果: 每隔四位插入空格: <view class='item_list'> <label>银行卡号:< ...

  3. 【webpack】从零开始学webpack

    背景:目前公司的项目全是用vue写的,建项目的话使用的是用vue-cli直接配置好的webpack,进行打包.现在我就是想实现自己写一个类似vue-cli的架子 一.安装全局依赖 npm instal ...

  4. Android Studio 快速实现上传项目到Github(详细步骤)

    前言: 本文主要讲解如何将Android Studio项目上传至GitHub,在此之前,先介绍几个概念. Android Studio:是谷歌推出一个Android集成开发工具,基于IntelliJ ...

  5. 分布式部署下的报表调用 API调用 权限问题以及性能方案

     背景描述: 客户的实际情况是需要在具体系统构架前,通过与厂商讨论确定最终的系统架构方案. 需求是客户自己有管理系统,希望建立一个独立的报表服务器,该报表服务器可以对多个管理系统提供报表服务,不知 ...

  6. 八、Web移动端Fixed布局的解决方案

    移动端业务开发,iOS 下经常会有 fixed 元素和输入框(input 元素)同时存在的情况. 但是 fixed 元素在有软键盘唤起的情况下,会出现许多莫名其妙的问题. 这篇文章里就提供一个简单的有 ...

  7. Typescript 接口(interface)

    概述 typescript 的接口只会关注值的外形,实际就是类型(条件)的检查,只要满足就是被允许的. 接口描述了类的公共部分. 接口 interface Person { firstName: st ...

  8. 【转】stropts.h: No such file or directory – How to Fix

    原文地址:stropts.h: No such file or directory – How to Fix 作者:xjc2694 It is a known issue that modern Li ...

  9. BeautifulSoup爬虫基础知识

    安装beautiful soup模块 Windows: pip install beautifulsoup4 Linux: apt-get install python-bs4 BS4解析器比较 BS ...

  10. 通过ffplay实现摄像头preview

    通过ffplay实现摄像头preview 硬件平台:Jetson TK1 开发板(NVIDIA Tegra K1 Mobile Processor 32bit),宁波舜宇光电SP103A(OV1682 ...