随着移动互联网的发展,手机使用越来越广泛,sqlite作为手机端存储的一种解决方案,使用也非常普遍。但是sqlite本身安全特性却比较弱,比如不支持用户权限,只要能获取到数据库文件就能进行访问;另外也没有加密功能,任何人获取到文件后,就可以查到明文数据。这使得大家对于sqlite又爱又不敢用,毕竟用户的隐私是非常重要的。Sqlite分为开源版本和收费版,收费的版本是支持加密的,只不过需要付2000刀的技术支持费。当然,由于sqlite本身是开源的,业内有很多产品对sqlite增加了加密功能,比如wxsqlite,sqlcipher等。因此想免费使用加密版本的sqlite也不是不可以,但前提是使用过程遇到问题,一定要能hold住,因为免费的东西不一定是稳定的。废话少说,本文主要讨论两个问题, 1.自己如何实现sqlite的加密功能,2.如何使用加密的sqlite。

加密算法选择

要实现加密,首先需要选择一种主流、高效、安全的加密算法,对于手机端和嵌入式设备,还要加上一条简单的原则。加密算法主要分为对称加密算法和非对称加密算法,对于文本加密一般采用对称加密,而对于秘钥的管理则采用非对称加密。目前主流的对称加密算法有DES,AES,RC系列,TEA系列, Blowfish等,非对称加密算法有RSA、Diffie-Hellman等。本人对几种常见的对称加密算法进行了测试,综合起来AES和XXTEA算法性能最好,XXTEA的优势在于实现非常简单,代码不到100行,在端设备上也是一种优势。另外,腾讯一直在使用TEA系列算法作为它的通讯加密和本地存储加密,用实践证明了TEA系列算法的可靠性和安全性。下图是AES算法和XXTEA算法的一些测试数据,仅供参考。XXTEA-256和XXTEA-64,分别表示块大小是256个INT和64个INT。通过测试读写200M数据的时间来评估算法的优劣,每个数据通过测试5次取平均值。

不加密

AES

XXTEA-256

XXTEA-64

写操作

7879.3ms

10283.6ms

10577.3ms

10649.4ms

读操作

315.69ms

3681.4ms

3527ms

3598ms

上层应用加密

选择好加密算法,那么要实现加密功能了。有童鞋会问,为啥一定要在sqlite内部实现加密,上层应用加密不是一样OK吗?这个确实可以。很多开发语言都自带了加密库函数,直接调用即可。写入数据时进行加密,读出数据时再进行解密。但这种方式主要有以下几个缺点:

  1. 对于加密的数据列,无法使用索引,虽然可以用等值查询,但对于范围查询则无能为力。而且所有类型需要设计为BLOB类型,来存储密文。
  2. 虽然可以对数据列进行加密,但表的元数据无法加密。

所以,总地来说,应用层是一种解决方案,但对开发者不太友好。

sqlite自身加密

从原理上来看,加入加密模块功能也相对简单,在写入数据块前,调用加密模块进行数据块加密,然后写入文件;而在读取数据块时,先调用加密模块解密,然后加载到缓存。加密模块(红色标注)在整个sqlite实现框架的位置如下图。

实现层面,我们要做的工作主要包括三部分,实现加密算法,然后将加密接口与sqlite关联起来,最后在合适的位置(读写文件),调用加/解密接口完成加密解密工作。由于sqlite自身已经预留了加解密接口,因此第3部分的工作已经帮我们做了,我们只需要实现第1和第2部分工作。核心接口如下:

1.sqlite3CodecAttach

含义:调用sqlite3PagerSetCodec 将加密接口与sqlite的pager模块关联

2.xxxCodec

含义:自己定义的加密接口,输入参数是(page_no,读写模式),将指定page加、解密。

3.sqlite3_key

含义:设置数据库密钥,sqlite3_open后调用该接口。对于非加密库,若调用该接口,会导致后续访问数据报错。

Error: file is encrypted or is not a database

4.sqlite3_rekey

含义:修改数据库密钥,这个接口会遍历数据库中的所有页,然后用新密钥对页进行加密,写入文件。若将新密钥设置为NULL,则可以将加密库变为普通库。

5.sqlite3_activate_see

sqlite3CodecGetKey

这两个接口没有实际作用,可以实现一个空函数,保证能编译通过就行。

加密sqlite使用

如果顺利,我们现在已经有了一个包含加密功能的sqlite了,那么如何使用?下面主要列了一些常见的场景。

1.如何判断一个db文件是否加密

$sqlite3 ./data/test.db

sqlite> .tables Error: file is encrypted or is not a database

sqlite> pragma key='123456' ;

sqlite> .tables

Error: file is encrypted or is not a database

对于加密的db文件,如果没有执行pragma key=xxx命令直接执行,则会报错。假设密码是 123456,报错后,重新执行pragma key命令,然后执行.tables,这时候依旧报错。这个主要是因为密钥在连接创建时初始化,所以对于加密数据库,需要执行的第一条命令是pragma key=xxx

2.导出加密文件数据

$sqlite3 ./data/test.db // 打开加密数据库文件test.db

sqlite> pragma key='123456';   // 设置秘钥

sqlite> .output aaa.sql //将输出重定向到文件aaa.sql

sqlite> .dump //导出数据库

sqlite> .exit   这样aaa.sql中包含了test.db中数据库的明文内容。

3.解密加密数据库

$sqlite3 ./data/test.db

sqlite> pragma key='123456'

sqlite> pragma rekey='';  //设置密钥为空,则将密文数据库解密。

//解密后可以直接打开数据库

$sqlite3 ./data/test.db

sqlite> .tables

  • orders  t1  user

sqlite> .exit

参考文档

https://en.wikipedia.org/wiki/XXTEA

SQLite学习笔记(十)&&加密的更多相关文章

  1. SQLite学习笔记(十二)&&虚拟机指令

    上篇文章简单讨论了虚拟机的原理,这篇文章我们详细讨论下指令,具体从几种典型的SQL语句来看看每种SQL对应的指令流,以及每个指令的含义.通过explain语句,可以看到语句对应的指令流:通过pragm ...

  2. SQLite学习笔记(七)&&事务处理

    说到事务一定会提到ACID,所谓事务的原子性,一致性,隔离性和持久性.对于一个数据库而言,通常通过并发控制和故障恢复手段来保证事务在正常和异常情况下的ACID特性.sqlite也不例外,虽然简单,依然 ...

  3. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  4. python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例

    python3.4学习笔记(十四) 网络爬虫实例代码,抓取新浪爱彩双色球开奖数据实例 新浪爱彩双色球开奖数据URL:http://zst.aicai.com/ssq/openInfo/ 最终输出结果格 ...

  5. Sqlite学习笔记(四)&&SQLite-WAL原理(转)

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  6. Learning ROS for Robotics Programming Second Edition学习笔记(十) indigo Gazebo rviz slam navigation

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 moveit是书的最后一章,由于对机械臂完全不知,看不懂 ...

  7. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  8. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  9. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

随机推荐

  1. 【分享】标准springMVC+mybatis项目maven搭建最精简教程

    文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...

  2. REST简介

    一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...

  3. Python高手之路【二】python基本数据类型

    一:数字 int int(整型): 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483647 在64位系统上,整数的位数为64位,取值 ...

  4. Mysql存储引擎及选择方法

    0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...

  5. 马里奥AI实现方式探索 ——神经网络+增强学习

    [TOC] 马里奥AI实现方式探索 --神经网络+增强学习 儿时我们都曾有过一个经典游戏的体验,就是马里奥(顶蘑菇^v^),这次里约奥运会闭幕式,日本作为2020年东京奥运会的东道主,安倍最后也已经典 ...

  6. setCapture、releasCapture 浅析

    1. setCapture 简介 setCapture可以将鼠标事件锁定在指定的元素上,当元素捕获了鼠标事件后,该事件只能作用在当前元素上. 以下情况会导致事件锁定失败: 当窗口失去焦点时,锁定的事件 ...

  7. Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记

    0x00 前言 之前一直使用的是 EF ,做了一个简单的小项目后发现 EF 的表现并不是很好,就比如联表查询,因为现在的 EF Core 也没有啥好用的分析工具,所以也不知道该怎么写 Linq 生成出 ...

  8. CSS三个定位——常规、浮动、绝对定位

    .dage { width: 868px; background: #5B8C75; border: 10px solid #A08C5A; margin-top: -125px; margin-le ...

  9. SNMP简单网络管理协议

    声明:以下内容是学习谌玺老师视频整理出来(http://edu.51cto.com/course/course_id-861.html) SNMP(Simple Network Management ...

  10. linux练习题

    观察系统当前进程的运行情况的命令是( ):A.freeB.dmesgC.topD.last 答案:http://hovertree.com/tiku/bjag/foxg5n0q.htm Linux系统 ...