@数据库加密
SQLite加密方式 [转]https://www.cnblogs.com/daguo/p/3747858.html

关于SQLite

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

然而免费版的SQLite有一个致命缺点:不支持加密。这就导致存储在SQLite中的数据可以被任何人用任何文本编辑器查看到。

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

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

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

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

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

SQLite Encryption Extension (SEE)
事实上SQLite有加解密接口,只是免费版本没有实现而已。而SQLite Encryption Extension (SEE)是SQLite的加密版本,提供以下加密方式:
RC4
AES-128 in OFB mode
AES-128 in CCM mode
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创建的数据库。
NSString databasePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]
stringByAppendingPathComponent: @“cipher.db”];
sqlite3 db;
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK) {
const char
key = [@“BIGSecret” UTF8String];
sqlite3_key(db, key, strlen(key));
int result = sqlite3_exec(db, (const char
) “SELECT count(*) FROM sqlite_master;”, NULL, NULL, NULL);
if (result == SQLITE_OK) {
NSLog(@“password is correct, or, database has been initialized”);
} else {
NSLog(@“incorrect password! errCode:%d”,result);
}

    sqlite3_close(db);
}

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

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

使用SQLCipher加密已存在的数据库
SQLCipher提供了sqlcipher_export()函数,该函数可以方便的对一个普通数据库导入到SQLCipher加密加密的数据库中,操作方式如下:
$ ./sqlcipher plaintext.db
sqlite> ATTACH DATABASE ‘encrypted.db’ AS encrypted KEY ‘testkey’;
sqlite> SELECT sqlcipher_export(‘encrypted’);
sqlite> DETACH DATABASE encrypted;

解除使用SQLCipher加密的数据库密码
sqlcipher_export()函数同样可以将SQLCipher加密后的数据库内容导入到未加密的数据库中,从而实现解密,操作方式如下:
$ ./sqlcipher encrypted.db
sqlite> PRAGMA key = ‘testkey’;
sqlite> ATTACH DATABASE ‘plaintext.db’ AS plaintext KEY ‘’; – empty key will disable encryption
sqlite> SELECT sqlcipher_export(‘plaintext’);
sqlite> DETACH DATABASE plaintext;

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

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

参考文档
The SQLite Encryption Extension (SEE)

SQLiteEncrypt

SQLiteCrypt

SQLite with encryption/password protection

SQLCipher

数据库加密sqlite3相关推荐

  1. [DB那些事]数据库加密

    说到数据库加密,目前最好且唯一的方案就是SqlCipher对sqlite3整体加密,微信也用的它.开源,且支持很多平台. 单就Android来说,集成不算太麻烦,1个jar包,3个so库,1个zip. ...

  2. PYTHON 数据库 之 sqlite3

    零 SQLite数据库的创建和使用 一.SQLite数据库的创建 1>. 安装SQLite数据库(在Windows上安装SQLite) SQLite以其零配置而闻名,所以不需要复杂的设置或管理. ...

  3. SQLITE数据库加密

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

  4. Qt调用SQLCipher实现数据库加密/解密

    书接上回. (1条消息) Qt 使用Sqlite3数据库加密_ 刘一儿(嵌入式)-CSDN博客_qt sqlite数据库加密 加密后,如何在命令行进行解密呢? SQLCipher官网API:SQLCi ...

  5. Sqlite数据库加密方法

    方法一:对sqlite中的数据进行加密 对数据库中插入的字段内容先进行AES.MD5等加密后在插入到数据库中,在使用时先从数据库中取出数据,然后在解密在使用这种方式好是好,但是有些致命的问题不能绕过, ...

  6. 【数据库】sqlite3数据库备份、导出方法汇总

    [数据库]sqlite3常用命令及SQL语句 目录 1.直接拷贝数据库 2.使用.backup .clone 1)交互式 2)脚本 3.导出到csv文件中(其它格式类似) 1)交互式 2)脚本 3)导 ...

  7. 【数据库】sqlite3常用命令及SQL语句

    [数据库]sqlite3数据库备份.导出方法汇总 一.准备工作 0.安装SQLite3 1)ubuntu命令安装(不是最新版本) sudo apt install sqlite3 2)源码安装(可以安 ...

  8. laravel mysql 锁表_Laravel 数据库加密及数据库表前缀配置方法

    报错问题:DecryptException in Encrypter.php line 148: The MAC is invalid. 如何运行 php artisan key:generate 这 ...

  9. 在数据库技术中脏数据是指_数据库安全关键技术之数据库加密技术

    数据库加密作为近年来兴起的数据库安防技术,已经被越来越多的人所重视.这种基于存储层加密的防护方式,不仅可以有效解决数据库明文存储引起的泄密风险,也可以防止来自内部或者外部的入侵及越权访问行为. 从技术 ...

最新文章

  1. [bug]超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。...
  2. android webview 抖动,【报bug】关于webview中上下滑动出现抖动的问题
  3. 程序员的前20个搜索和排序算法面试问题
  4. ADF声明性组件示例
  5. 阿里小二的日常工作要被TA们“接管”了!
  6. .NET中如何深度判断2个对象相等
  7. 实现删除商品信息功能
  8. java 通配符泛型_java泛型常用通配符实例解析
  9. 面试题之接口和抽象类的区别
  10. 2021年流动式起重机司机模拟考试题库及流动式起重机司机模拟考试系统
  11. Android 项目必备(二十)-->NFC 的基本使用
  12. 佳能Canon imageCLASS MF742Cdw 一体机驱动
  13. dhclient命令 – 动态获取或释放IP地址
  14. linux spec cpu,SPEC CPU2006的安装和使用
  15. 用matlab求摆线,摆线-最速降曲线Matlab示例
  16. 解决react项目启动报错:error Couldn't find a package.json
  17. Python编程练习:斐波那契数列
  18. PPIO边缘云聚焦音视频底层技术,探索元宇宙“登月工程”
  19. VB利用多张PNG图片制作动画
  20. 物流软件行业Top企业概况与各地发展优劣势分析

热门文章

  1. 【洛谷八连测R2】fateice-or
  2. pdf和word等文档添加水印
  3. 目前互联网的技术发展现状和趋势如何?
  4. 律师程海认为北京市办理暂住证行为违法
  5. 基于深度学习的3D pose estimation总结(包括几篇2D pose estimation)
  6. 90个面试问题(带答案)
  7. springboot中druid数据源配置无效的问题和jar包找不到问题
  8. sourcemap(未完,待续)
  9. 华为鸿蒙系统8月开源,华为正式宣布,鸿蒙系统8月开源,任正非却说:优先选用安卓...
  10. 人到底是为了什么活着?