一、前言
sqlite是一个轻量级的、跨平台的、开源的嵌入式数据库引擎,也是一个关系型的的使用sql语句的数据库引擎,
读写效率高、资源消耗总量少、延迟时间少,使其成为移动平台数据库的最佳解决方案(如android、ios)
但是android上自带的sqlite数据库是没有实现加密的,我们可以通过android studio直接导出应用创建的数据库文件,然后通过如sqlite expere personal 这种可视化工具打开数据库文件进行查看数据库的表结构,以及数据,这就导致存储在sqlite中的数据可以被任何人查看,如果是一些账号密码,或者聊天数据等,那么我们的应用就面临着严重的安全漏洞隐患;
二、数据库加密方法
因为android自带的sqlite数据库本身是没有实现加密的,那我们如何实现对数据库的加密呢?
(1)对sqlite数据库的数据进行加密
我们可以在程序中对保存到数据库中的数据 进行加密后保存,然后查询数据的时候,对查询的数据进行解密后使用,如果还不希望别人看到数据库的表结构,我们可以对数据库名字,表名,表中的字段名字使用md5等加密手段加密后再进行操作;
这种方法是可以达到数据库加密的目的的,但是相对来说操作就比较繁琐了
(2)使用sqlcipher对sqlite数据库加密
sqlcipher是基于sqlite基础之上实现了数据库加密的开源库,可以采用第三方的开源框架sqlcipher,sqlcipher是基于原生sqlite数据库进行扩展,实现数据库整体加密(数据库文件加密),提供的数据库的操作接口,和原生的sqlite数据库操作接口基本一样的;我们创建或者打开数据库都需要密码,我们打开数据库时的密码,需要和创建数据库时的密码保护一致,否则打开数据库时会报错,提示打开的文件不是一个数据库文件
net.sqlcipher.database.sqliteexception: file is not a database;
我们导出的数据库文件,通过sqlite expere personal这类可视化工具也是无法直接打开的;但是可以使用db browser for sqlite这个数据库查看工具进行查看,查看的时候输入创建数据库时使用的加密密码
sqlcipher的特点:
sqlcipher 占用空间小,性能好,因此非常适合保护嵌入式应用程序数据库,非常适合移动开发。
(1)极快的性能,加密开销低至 5-15%
(2)数据库文件中的数据 100% 已加密,是对所有数据文件,包括数据文件和缓存、结构文件等等进行加密。
(3)使用良好的安全实践(cbc 模式、密钥派生),加密算法是256位 aes 在 cbc 模式
(4)使用 openssl 加密库提供的算法
在android中集成sqlitecipher:
-添加sqlitecipher的依赖
implementation 'net.zetetic:android-database-sqlcipher:4.4.3@aar' implementation "androidx.sqlite:sqlite:2.0.1"
-使用sqlitecipher提供的相关接口操作
sqlitedatabase.loadlibs(this) val databasefile = getdatabasepath("demo.db") if (databasefile.exists()) databasefile.delete() databasefile.mkdirs() databasefile.delete() val database = sqlitedatabase.openorcreatedatabase(databasefile, "test123", null) database.execsql( "create table " + databasehelper.table_music_type + " (type_id integer primary key autoincrement not null," + "type_no integer,type_name text)" ) database.execsql( "insert into " + databasehelper.table_music_type + " (type_no,type_name) " + "values ('" + 1 + "','" + "送餐音乐" + "')" )
上面的代码在调用时,会创建数据库demo.db,传入了数据库密码,并且创建了一个表music_type,并且向表中插入了一条数据;
注意代码中的数据库相关的操作,都是使用sqlitecipher中的相关接口即net.sqlcipher.database包名下的相关接口,不要使用成了原生sqlite的相关接口
sqlitedatabase.loadlibs(this) val databasefile = getdatabasepath("demo.db") val database = sqlitedatabase.openorcreatedatabase(databasefile, "test123", null) val cursor = database.rawquery( "select * from " + databasehelper.table_music_type, null ) var musictypelist: mutablelist<musictypebean> = mutablelistof(); while (cursor.movetonext()) { var musictypebean = musictypebean(); musictypebean.id = cursor.getint(cursor.getcolumnindex("type_no")) musictypebean.name = cursor.getstring(cursor.getcolumnindex("type_name")) musictypelist.add(musictypebean) } cursor.close() log.e(tag, "onclick: " + musictypelist.size)
上述代码就是查询demo.db数据库中的music_type表中的数据,获取数据库对象的时候,注意传入的密码和创建数据库时要保持一致;
上面使用sqlitecipher创建数据库和表,以及向表中插入数据,查询表中的数据,除了创建数据库获取可读写数据库对象和原生sqlite api有些区别一样,其他执行sql语句,查询表中数据的api 和原生 sqlite api是完全一样的;
sqlitecipher结合room框架使用
我们知道在使用sqlite数据库的时候,我们往往会使用一些比较方便的orm(对象关系映射)框架来帮助我们操作数据库,如greendao,room(jetpack组件)等,那如何将sqlitecipher结合这些orm框架使用;我们这里介绍一下google jetpack组件中的orm框架 room结合sqlitecipher使用;
其实room结合sqlitecipher使用,就是在创建数据库时候,需要先创建一个supportfactory
,supportfactory中会传入通过sqlitecipher中的sqlitedatabase获取的密码字节数据
sqlitedatabase.loadlibs(this) val passphrase = sqlitedatabase.getbytes("test123".tochararray()) val factory = supportfactory(passphrase, object : sqlitedatabasehook { override fun prekey(database: sqlitedatabase?) { logutil.e(tag, "prekey") } override fun postkey(database: sqlitedatabase?) { logutil.e(tag, "postkey") } }, true)
然后在创建数据库的时候,通过room自带的openhelperfactory()方法传入创建的supportfactory即可,这样就能创建加密数据库了;其他操作,就按照room正常的操作即可
var minstance= room .databasebuilder( context.applicationcontext, appdatabase::class.java, db_name ).addcallback(object : roomdatabase.callback() { override fun oncreate(db: supportsqlitedatabase) { super.oncreate(db) log.e(tag, "oncreate: ") initmusictypedata(context, db) } }).openhelperfactory(factory) .build()
查看并导出加密数据库文件
-导出数据库文件
我们手机通过usb连接电脑之后,打开开发者模式,然后在android studio菜单栏中的view->
tool windows->device file explorer
然后在device file explorer中进入 data/data/应用包名/databases中找到我们创建的数据库文件demo.db,然后我们可以右键改文件save as 导出该数据库文件
-查看加密数据库文件
前面我们已经提到过,可以通过db browser for sqlite来查看加密的数据库文件
下载地址:https://sqlitebrowser.org/dl/
下载安装之后,我们打开安装目录下的db browser for sqlcipher.exe程序,然后通过菜单栏中的文件->打开数据库->打开导出的加密数据库文件,然后输入数据库文件的加密密码,就是我们在程序中sqlitecipher加密数据库文件时使用的密码,输入正确密码后,可以正常打开数据库文件
右键表名,选择浏览数据,即可查看表中的数据
到此这篇关于android sqlite数据库加密的操作方法的文章就介绍到这了,更多相关android sqlite数据库加密内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!