使用SQLCipher对SQLite数据库加密

详解Android数据存储之SQLCipher数据库加密

Android Room数据库加密详解

SQLite是一个轻量级的、跨平台的、开源的嵌入式数据库引擎,也是一个关系型的的使用SQL语句的数据库引擎,
读写效率高、资源消耗总量少、延迟时间少,使其成为移动平台数据库的最佳解决方案(如Android、iOS)
但是Android上自带的SQLite数据库是没有实现加密的,我们可以通过Android Studio直接导出应用创建的数据库文件,然后通过如SQLite Expere Personal 这种可视化工具打开数据库文件进行查看数据库的表结构,以及数据,这就导致存储在SQLite中的数据可以被任何人查看,如果是一些账号密码,或者聊天数据等,那么我们的应用就面临着严重的安全漏洞隐患; 因此有了一些数据库的加密操作。几乎所有的APP应用数据都会存储在SQLite数据库中。


常用的方法有两种。一种是对SQLite数据库的数据进行加密,如库名表名字段名等等;第二种就是使用SQLCipher对SQLite数据库加密主要就说一下第二种。

怎么提取应用数据文件,提取数据这里不做陈述,不会的自己先熟悉一下安卓文件存储结构去。

SQLCipher是基于SQLite基础之上实现了数据库加密的开源库,可以采用第三方的开源框架SQLCipher,SQLCipher是基于原生SQlite数据库进行扩展,实现数据库整体加密(数据库文件加密),提供的数据库的操作接口,和原生的SQLite数据库操作接口基本一样的;我们创建或者打开数据库都需要密码,我们打开数据库时的密码,需要和创建数据库时的密码保护一致,否则打开数据库时会报错,提示打开的文件不是一个数据库文件

file is not a database

说明该文件无法直接访问,

SQLCipher的特点就不做赘述了,说一下Android中集成SQLiteCipher:

  • 添加依赖
    implementation 'net.zetetic:android-database-sqlcipher:4.4.3@aar'
    implementation "androidx.sqlite:sqlite:2.0.1"
  • 使用SQLiteCipher提供的相关接口操作
除了创建数据库获取可读写数据库对象和原生SQLite API有些区别一样,其他执行SQL语句,查询表中数据的API 和原生 SQlite API是完全一样的
  • SQLiteCipher结合Room框架

我们这里介绍一下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 导出该数据库文件

    使用SQLCipher对SQLite数据库加密_第1张图片

  • 查看加密数据库文件

    可以通过DB Browser for SQLite来查看加密的数据库文件
    下载地址:https://sqlitebrowser.org/dl/

    下载安装之后,我们打开安装目录下的DB Browser for SQLCipher.exe程序,然后通过菜单栏中的文件->打开数据库->打开导出的加密数据库文件,然后输入数据库文件的加密密码,就是我们在程序中SQLiteCipher加密数据库文件时使用的密码,输入正确密码后,可以正常打开数据库文件

    使用SQLCipher对SQLite数据库加密_第2张图片

    使用SQLCipher对SQLite数据库加密_第3张图片

    使用SQLCipher对SQLite数据库加密_第4张图片

你可能感兴趣的:(Android,android,studio,android,python)