SqlCipher for android开发实战

SqlCipher 是一个对SqlLite数据库加密的组件。核心程序是C++编写的。加密后数据库文件的内容也是加密的,在读写时需要密码进行加解密。

一、组件特点:

1、SqlLite的官方版本也有加密功能,但加密功能不开源。并且官方加密功能与SqlCipher的加密不同。SqlCipher是在官方不带加密的开源代码库上扩展的加密功能,所以SqlCipher的版本与SqlLite的版本有对应关系。

2、SqlCipher的加密也是有多个版本的,各版本之间是不兼容的。所以使用时如果升级SqlCipher版本需要注意已生成的数据库文件版本要对应才能正常读写。

二、组件使用限制和依赖:

SqlCipher只是核心组件是开源的,但开源代码库不包含libcrypto.a。需要自行集成此组件。在代码库的readme有写集成方法,但需要用linux环境生成。

SqlCipher支持安卓,IOS这些是插件是在核心组件上扩展的项目,这些项目的开源规则并不相同。SqlCipher支持安卓的旧版本名称是android-database-sqlcipher,此组件官方已经不再支持。新项目名称是SqlCipher for Android,所以网上其它文章的代码示例有新有旧,大家要注意不能混用。

SqlCipher for android 是不开源的,但可以免费使用编译后的插件。对应需要android sdk 29及以上的版本,此版本兼容harmony os的2.0和3.0 版本(本人真机验证)。验证使用的版本依赖如下

implementation 'net.zetetic:sqlcipher-android:4.5.5@aar'
implementation 'androidx.sqlite:sqlite:2.2.0'

这里依赖的androidx.sqlite.sqlite不能改成2.1.0,否则无法运行。官网上查到历史上旧版本这2个组件的版本号对应关系。如果项目本身不支持此版本就无法使用这个插件了。另外这2个插件以及关联和依赖是通过远程maven库下载的,网络不稳定时影响编译调试。

三、组件的开发问题:

1、开发时需要转换普通库和加密库, 一种可以使用工具Browser for SqlLite操作加密库(支持多个版本)。  另一种是插件使用sqlcipher_export 函数转换加密和解密,但前文版本调用sqlcipher_export函数时不稳定(个人推断此函数是异步执行),如果数据库小于4MB时会转换成功,内容再大就不转换或转换到一半。因为安卓JAVA代码是通过querySql执行此函数,但此方法同步方法无法感知转换是否完成。 

个人转换方法如下:

1)先打开未加密库A,再创建一个空的加密库B,将B附加到A的子库(使用attach database b库文件路径 as b库 key 密码 )。

2)使用  select * from sqlite_schema 查看主库A的所有表,索引和视图,此表有sql字段可以完成相应的索引和视图创建,表迁移 使用   create table xxxx as select * from xxxx 语句,此语句会创建并复制数据到附加库B中。

3)数据库迁移后断开附加库B,断开函数 detach database b库

2、与uniapp的集成

先在uniapp插件工程下集成sqlchiper组件,重新封装select ,update ,insert 函数,就可以在uniapp中调用 sqlchiper的相应数据库操作。

你可能感兴趣的:(企业办公,android,uniapp,sqlite)