【Android】数据安全(一) —— Sqlite加密
目录
- SQLCipher
- SQLiteCrypt
- 其它
SQLCipher
SQLCipher 是 SQLite 数据库的的开源扩展,使用了 256 位 AES 加密,支持跨平台、零配置、数据100%加密、加密开销低至 5 -15%、占用空间小、性能出色等优点,因此非常适合保护嵌入式应用程序数据库,并且非常适合移动开发。
关于 SQLCipher 的使用,官网提供了 SQLiteDatabase 的接入案例,鉴于官网已有 SQLiteDatabase 案例,这里则不再重复赘述,本文改为在 Room 中集成。
打开 app 目录下的 build.gradle 文件,添加插件和依赖
// 用到 kapt 必须添加该插件
apply plugin: 'kotlin-kapt'dependencies {// roomkapt("androidx.room:room-compiler:2.4.2")implementation "androidx.room:room-ktx:2.4.2"implementation("androidx.room:room-rxjava3:2.4.2")// sqlcipher 数据库数据加密implementation 'net.zetetic:sqlcipher-android:4.5.6@aar'implementation 'androidx.sqlite:sqlite:2.2.0'
}
新建一个继承 RoomDatabase() 的类,设置 SQLiteOpenHelper 。
@Database(entities = [Classes::class, Students::class], version = 2, exportSchema = false)
abstract class SchoolDatabase : RoomDatabase() {companion object {var db: SchoolDatabase ?= null// 单例模式的双重检查锁fun getDataBase(context: Context) : SchoolDatabase{if (db == null) {synchronized(SchoolDatabase::class.java){if (db == null){// 使用 SQLCipher 加密val factory = SupportOpenHelperFactory("database password".toByteArray())db = Room.databaseBuilder(context.applicationContext, SchoolDatabase::class.java, "your database name").openHelperFactory(factory).build()}}}return db as SchoolDatabase;}}
}
编写完成数据库的增删改查相关代码后,运行项目并完成对数据写入操作。
使用 Android Studio 的 Device Explorer 功能,打开 data/data/your package name/database/ 文件夹,就可以看到应用的数据库。

鼠标右键点击 your package name 下创建的数据库,选择 Save AS ... 保存到桌面,使用 SQLiteStudio 数据库工具打开,就会有这样的提示:无法添加数据库 C:/Users/XXX/Desktop/your database file:file is not a database
因为我们已经对数据库进行了加密,是不能直接对其进行访问的。需要更换数据类型为 SQLCipher ,并输入在代码中设置的数据库密码,点击 ok 后,就可以对数据库进行访问了。

如果未使用 SQLCipher 对数据库进行加密,数据库是可以直接访问的。
SQLCipher 除了能支持 SQLite、Room 之外,还支持 GreeDAO 数据库。不支持 ObjectDB。
下载 Demo
参考文档
SQLCipher 官网
在 Android 中集成 SQLCipher
SQLiteCrypt
SQLiteCrypt 为 SQLite 数据库添加了透明的 AES 256 加密支持。SQLiteCrypt 非常快,它只是使 SQLite 速度减慢几个百分点,因此您的用户甚至不会注意到它的存在。
SQLiteCrypt 也是一个可以免费使用的 SQLite 加密库,在它的官网下方,提供了 Linux、Ubuntu、Window、.Net、Android 等版本的 demo,SQLiteCrypt 并没有像 SQLCipher 那样提供了一个与 Room 库兼容的版本。Room 库是基于 Android 的SQLite API构建的,而 SQLiteCrypt 是一个 SQLite 的 C 扩展,它需要使用其自带的 API 来打开和操作加密的数据库。
使用 SQLiteCrypt 需要引入 .so 库,以及 .aar 文件。

dependencies {implementation(name:'android-database-sqlitecrypt-release', ext:'aar')
}
使用时,用的是 com.sqlitecrypt.database.SQLiteDatabase 进行创建数据库
public void initDb() {File dbFile = this.getDatabasePath("test.db");String dbPath = dbFile.getPath();if(!dbFile.exists()) {new File(dbFile.getParent()).mkdirs();}// 第二个参数为数据库的密码,可不填(即不设置加密),使用 SQLiteDatabase.changePassword(password) 加密SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, "", null);// 设置数据库的访问密码为 abc123db.changePassword("abc123");// 查询数据库里 student 的表db.rawQuery("SELECT * FROM student", null);// 插入一条数据db.execSQL("insert into student(id,name) VALUES(1, 'Sparta');");// 删除 student 表中 id = 1 的数据db.delete("student", "id=1", null);// 关闭数据库db.close();
}
com.sqlitecrypt.database.SQLiteDatabase 与 android.database.sqlite.SQLiteDatabase 的用法基本一致,它们都有 execSQL、rawQuery 的方法,只要有点数据库基础知识就可以写出可执行的 SQL 语句。
其它
上面提到的数据库加密框架都是可以免费使用,当然,他们也有付费版本。
我在写这篇博客之前,去了解了一些数据库加密的技术,有的博主提到一种方式:写入数据库前进行数据加密,取出来时解密。
这种方式看着是可行的,但 不可取
数据加密一般都是将一段字符转译为其它字符,例如:byte、String、二进制。众所周知的 MD5,知道吧?它是把字符转换成了16、32位长度的字符。不考虑解密,假设一个表有10个字段,这时候需要插入一条数据,那么就有 9 ~ 10 个字段需要调用 MD5 加密算法加密一次,这才只是10个字段,如果一个表有几十个字段呢?
如果这样搞,相较于上述两个加密方式来说,这种方式时间复杂度、空间复杂度都处于最差劲那一组,不仅如此,还增加了维护成本。
参考文档
SQLiteCrypt 官网
相关文章:
【Android】数据安全(一) —— Sqlite加密
目录 SQLCipherSQLiteCrypt其它 SQLCipher SQLCipher 是 SQLite 数据库的的开源扩展,使用了 256 位 AES 加密,支持跨平台、零配置、数据100%加密、加密开销低至 5 -15%、占用空间小、性能出色等优点,因此非常适合保护嵌入式应用程序数据库&a…...
云原生周刊:Helm Charts 深入探究 | 2024.3.11
开源项目推荐 Glasskube Glasskube 提供了一个用于 Kubernetes 的缺失的包管理器。它具有图形用户界面(GUI)和命令行界面(CLI)。Glasskube 包是具备依赖感知、GitOps 准备和可以通过中央公共包仓库自动更新的特性。 imgpkg imgpkg(发音为:"imag…...
【C++初阶】第六站 : 模板初阶
前言: 本章知识点:泛型编程、函数模板、类模板 专栏: C初阶 目录 泛型编程 函数模板 1.函数模板概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 5.模板参数的匹配原则 类模板 类模板的定义格式 类模板的实例化 泛型编程 如何实现一…...
训练保存模型checkpoint时报错SyntaxError: invalid syntax
在使用pytorch训练保存checkpoint时,出现如下报错: rootautodl-container-745411b452-c5cebfed:~/kvasir-seg-main# python train_transunet.py --loss_function"IoULoss" --training_augmentation0File "train_transunet.py", lin…...
虚拟机中安装Win98
文章目录 一、下载Win98二、制作可启动光盘三、VMware中安装Win98四、Qemu中安装Win981. Qemu的安装2. 安装Win98 Win98是微软于1998年发布的16位与32位混合的操作系统,也是一代经典的操作系统,期间出现了不少经典的软件与游戏,还是值得怀念的…...
《C++游戏编程入门》第4章 标准模板库: Hangman
《C游戏编程入门》第4章 标准模板库: Hangman 4.1 标准模板库4.2 vector04.heros_inventory2.cpp 4.3 使用迭代器04.heros_inventory3.cpp 4.4 使用算法04.high_scores.cpp 4.5 理解向量性能4.6 其他STL容器4.7 Hangman简介04.hangman.cpp 4.1 标准模板库 Standard Template L…...
Linux最小系统安装无法查看IP地址
1,出现原因 服务器重启完成之后,我们可以通过linux的指令 ip addr 来查询Linux系统的IP地址,具体信息如下: 从图中我们可以看到,并没有获取到linux系统的IP地址,这是为什么呢?这是由于启动服务器时未加载网…...
分享个好用的GPT网站
目录 一、背景 二、功能描述 1、写代码 2、联网查询 3、AI绘图 一、背景 我现在的开发工作都依靠ChatGPT,效率提升了好几倍。这样一来,我有更多时间来摸鱼,真是嘎嘎香~ ⭐⭐⭐点击直达 ⭐⭐⭐ 二、功能描述 1、写代码 import java.ut…...
hyperf 二十六 数据迁移 二
教程:Hyperf 参考文章hyperf 二十五 数据迁移 一-CSDN博客 根据之前写的数据迁移的文章,已经说明Hyperf\Database\Schema\Schema::create()实际运行Hyperf\Database\Schema\Grammars\MySqlGrammar::compileCreate()生成的sql字符串。 文档所谓"在…...
linux下如何hook第三方播放器的视频数据?
背景 作为显卡生产商,当用户使用我们的显卡硬解码播放视频时,如果出现比如花屏等问题,为了快速确定问题原因,我们需要一个工具来帮助判断出问题是出在原始视频端,亦或者是应用程序端,亦或者是显卡端。因此我们需要一种方法,来对目标播放器程序进行监控,并捕获到视频源的…...
如何通过Python代码连接OceanBase Oracle租户
背景 目前,连接数据库的Oracle租户,只能通过Java和C的驱动程序,无法通过其他语言的驱动程序。为了满足社区中用户希望在Python代码中连接Oracle租户的需求,这里提供一种替代方案。通过结合使用JayDeBeApi和JDBC,我们可…...
2 月 Web3 游戏行业动态
作者:stellafootprint.network 数据来源:区块链游戏研究页面 - Footprint Analytics 2024 年 2 月,区块链游戏领域在加密货币价格上涨和活跃用户激增的推动下,实现了显著增长。然而,行业在维持用户参与度和留存率方面…...
普发Pfeiffer Prisma QMS200四极质谱计内部电路图装配3D图电路板接口详细注解
普发Pfeiffer Prisma QMS200四极质谱计内部电路图装配3D图电路板接口详细注解...
2024.03.04——2024.03.10 力扣练习总结及专项巩固(二)
1. (22. 括号生成)这里只讨论第二种做法回溯法。在回溯法的函数void backtrack(vector<string>& ans, string& current, int open, int close, int n); 中,可分为三个if条件判断,分别判断当current.size() 2*n,ope…...
前端NodeJs笔记之包结构到进程和线程到命令行到Node模块化讲解
包结构 包实际上是一个压缩文件,解压以后还原为目录,符合规范的目录应该包含如下文件: -package.json 描述文件 -bin 可执行二进制文件 -lib js代码 -doc …...
【Java】获取手机文件名称补充
本地的 ADB 工具路径指的是你电脑上安装的 Android Debug Bridge(ADB)工具的路径。ADB 是 Android SDK 中的一个工具,用于与连接到计算机上的 Android 设备进行通信。你需要确保 ADB 已正确安装,并知道其在你计算机上的位置。 通…...
YoloV8改进策略:BackBone改进|TransNeXt:ViT的鲁棒Foveal视觉感知
文章目录 摘要论文:《TransNeXt:ViT的鲁棒Foveal视觉感知》1、引言2、相关工作3、方法3.1、聚合像素焦点注意力3.1.1、像素焦点注意力3.1.2、在单个混合器中聚合不同的注意力3.1.3、克服多尺度图像输入3.1.4、特征分析3.2、卷积门控单元(Convolutional GLU)3.2.1、动机3.2.…...
三维的旋转平移矩阵形式
在三维空间中,一个物体或坐标系的旋转和平移可以通过一个4x4的变换矩阵来表示。这个矩阵通常被称为仿射变换矩阵或齐次变换矩阵。它结合了旋转矩阵和平移向量的功能,能够同时表示旋转和平移操作。 一个4x4的旋转平移矩阵通常具有以下形式: 复…...
ChatGPT+MATLAB应用
MatGPT是一个由chatGPT类支持的MATLAB应用程序,由官方Toshiaki Takeuchi开发,允许您轻松访问OpenAI提供的chatGPT API。作为官方发布的内容,可靠性较高,而且也是完全免费开源的,全程自己配置,无需注册码或用…...
C语言—冒泡排序
C语言—冒泡排序 原理过程讲解代码1、直接在主函数里面实现2、编写函数进行实现 原理 冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
