【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、编写函数进行实现 原理 冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。 以从小到大排序…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
