【Android】数据安全(一) —— Sqlite加密

news2024/11/17 21:43:12

目录

  • SQLCipher
  • SQLiteCrypt
  • 其它

SQLCipher

SQLCipherSQLite 数据库的的开源扩展,使用了 256 位 AES 加密,支持跨平台、零配置、数据100%加密、加密开销低至 5 -15%、占用空间小、性能出色等优点,因此非常适合保护嵌入式应用程序数据库,并且非常适合移动开发。

关于 SQLCipher 的使用,官网提供了 SQLiteDatabase 的接入案例,鉴于官网已有 SQLiteDatabase 案例,这里则不再重复赘述,本文改为在 Room 中集成。

打开 app 目录下的 build.gradle 文件,添加插件和依赖

// 用到 kapt 必须添加该插件
apply plugin: 'kotlin-kapt'

dependencies {
	// room
    kapt("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 StudioDevice 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 除了能支持 SQLiteRoom 之外,还支持 GreeDAO 数据库。不支持 ObjectDB

下载 Demo

参考文档

SQLCipher 官网
在 Android 中集成 SQLCipher

SQLiteCrypt

SQLiteCryptSQLite 数据库添加了透明的 AES 256 加密支持。SQLiteCrypt 非常快,它只是使 SQLite 速度减慢几个百分点,因此您的用户甚至不会注意到它的存在。

SQLiteCrypt 也是一个可以免费使用的 SQLite 加密库,在它的官网下方,提供了 LinuxUbuntuWindow.NetAndroid 等版本的 demo,SQLiteCrypt 并没有像 SQLCipher 那样提供了一个与 Room 库兼容的版本。Room 库是基于 AndroidSQLite 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);
	// 设置数据库的访问密码为 abc123
	db.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.SQLiteDatabaseandroid.database.sqlite.SQLiteDatabase 的用法基本一致,它们都有 execSQLrawQuery 的方法,只要有点数据库基础知识就可以写出可执行的 SQL 语句。

其它

上面提到的数据库加密框架都是可以免费使用,当然,他们也有付费版本。

我在写这篇博客之前,去了解了一些数据库加密的技术,有的博主提到一种方式:写入数据库前进行数据加密,取出来时解密。

这种方式看着是可行的,但 不可取

数据加密一般都是将一段字符转译为其它字符,例如:byte、String、二进制。众所周知的 MD5,知道吧?它是把字符转换成了16、32位长度的字符。不考虑解密,假设一个表有10个字段,这时候需要插入一条数据,那么就有 9 ~ 10 个字段需要调用 MD5 加密算法加密一次,这才只是10个字段,如果一个表有几十个字段呢?

如果这样搞,相较于上述两个加密方式来说,这种方式时间复杂度、空间复杂度都处于最差劲那一组,不仅如此,还增加了维护成本。

参考文档

SQLiteCrypt 官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509514.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云ECS磁盘扩容操作手册

云原生专栏大纲 文章目录 ESC磁盘扩容步骤前提条件云盘备份云盘扩容扩容分区和文件系统前提条件操作视频操作步骤准备工作:获取目标云盘信息步骤1:扩容分区步骤2:扩容文件系统 ESC磁盘扩容步骤 扩容已有云盘的操作步骤和注意事项_云服务器 …

excel如何查找两张表格共有的名单信息

我们需要在表格一中查找表格二中有名单的数据行 或者我想在表格二中查找表格一中有数据的数据行 这时候就可以使用上我们的公式啦 IF(COUNTIF(Sheet2!$B$2:$B$11326,B5),"YES") Sheet2:表示需要查询内容所在的表格 $B$2:表示从Sheet2表中的B2…

C语言标准库函数qsort( )——数据排序

大家好!我是保护小周ღ,本期为大家带来的是深度解剖C语言标准库函数 qsort(),qsort()函数他可以对任意类型的数据排序,博主会详细解释函数使用方法,以及使用快速排序的左右指针法模拟实现函数功能,这样的排…

VSCode提交代码

VSCode提交代码方式: 先在电脑本地文件夹中打开git的bash窗口使用git clone https://github.com/xxxx/克隆仓库地址到本地,并生成一个项目的文件夹打开VSCode,点击文件按钮,打开加载项目的文件夹对于VSCode设置Git路径&#xff…

Linux多线程编程条件变量的概述和使用方法

目录 概述 1 引入条件变量概念 2 条件变量的应用 2.1 创建与销毁 2.1.1 创建条件变量 2.1.2 销毁条件变量 2.2 等待与通知 2.2.1 等待 2.2.2 通知 3 使用条件变量的范例 3.1 编写代码 3.2 测试 4 参考文献 概述 本文介绍了linux多线程编程中条件变量的相关知识&a…

09-设计模式 面试题

你之前项目中用过设计模式吗? 工厂方法模式分类 简单工厂模式工厂方法模式抽象工厂模式工厂模式 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore)…

qsort函数的模拟和使用(两万字详解)

qsort 的使用(回调函数结构体指针的总和运用) qsort的作用 qsort--用来排序的 库函数,直接可是用来排序数据 底层使用的是快速排序的方式 —————————————————————————————————————————————…

【绿电监测 碳排放分析 新建5G基站】基站能效管理解决方案

背景及需求 中国基站相关政策 需求 01用电监管,偷电窃电监测 对基站进线回路和出线回路进行监测对比,实时监测线路的使用功率,通过最大功率判断是否有其他设备接入而产生偷电行为。 02节能控制 通过控制空调启停、调整通讯设备工作模式或…

http升级https需要做什么

背景:随着现代网络时代的高速发展,网络安全方面的日益更新,实现网站https协议的数量也在不断增多,完善安全方面的因素也在逐步增加。 下面从最基础的网站http协议全面升级为https协议的流程做出说明。 目录 首先带大家一起先了解…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-3、线条平滑曲面(原始颜色)去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fr…

HTML5七天学会基础动画网页10(2)

制作立方体 学完前面的基础内容&#xff0c;制作立方体是个不错的练习方法&#xff0c;先看成品 再分析一下&#xff0c;六个面让每个面旋转平移就可以实现一个立方体&#xff0c;来看代码: <title> 制作立方体</title> <style> *{ margin: 0; padding: 0; …

Springboot+vue的政府管理的系统设计(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的政府管理的系统设计&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff…

案例分析篇01:软件架构设计考点架构风格及质量属性(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【大厂AI课学习笔记NO.79】机器学习行业人才能力图谱

有从事机器学习行业的小伙伴&#xff0c;人才岗位如上了。 同样的&#xff0c;也是分为领军人才&#xff08;略&#xff09;、产业研发人才、应用开发人才和实用技能人才了。 机器学习领域的就业岗位分析 随着科技的飞速发展&#xff0c;人工智能已成为当今时代最热门的领域…

Purple Pi OH鸿蒙开发板7天入门OpenHarmony开源鸿蒙教程【五】

在完成了Purple Pi OH大部分的接口测试之后&#xff0c;紧接着就是一个充满挑战的任务——利用SDK来编译生成我们自己的镜像文件。通过这一过程&#xff0c;不仅能够让你获得一个可在真实硬件上运行的系统镜像&#xff0c;更重要的是&#xff0c;它让你对OpenHarmony系统的构建…

分享个好用的GPT网站

目录 一、背景 二、功能描述 1、写代码 2、联网查询 3、AI绘图 一、背景 我现在的开发工作都依靠ChatGPT&#xff0c;效率提升了好几倍。这样一来&#xff0c;我有更多时间来摸鱼&#xff0c;真是嘎嘎香~ ⭐⭐⭐点击直达 ⭐⭐⭐ 二、功能描述 1、写代码 import java.ut…

Hyperopt自动化调参工具实践-1

hyperopt Hyperopt的任务是在一组可能的参数上找到标量值的最佳值&#xff0c;该标量值可能是随机的。 与许多优化包假定这些输入来自向量空间不同&#xff0c;Hyperopt是不同的&#xff0c;因为它鼓励使用者更详细地描述搜索空间。通过提供关于函数定义在哪里以及认为最佳值…

AI新工具(20240311) 国内免费使用Claude 3 Sonnet;Pika推出视频加音效功能

1: 国内免费使用Claude 3 Sonnet Claude 3现已登陆Amazon Bedrock&#xff0c;国内就能够免费使用&#xff0c;以下是网友整理的使用流程。 地址&#xff1a;https://lab.amazoncloud.cn/ 2: Pika Sound Effects Pika推出视频加音效功能&#xff0c;为视频创作带来声音定制…

举牌小人图生成小程序源码(修复版)

源码介绍&#xff1a; 举牌小人图生成小程序源码&#xff08;修复版&#xff09;无需服务器导入开发者工具即可运行&#xff0c;无需绑定合法域名&#xff0c;仅供学习交流 建议&#xff1a; 有能力者接入安全过滤机制&#xff0c;更完美&#xff0c;可以联系客服免费指导~ 源…

深度学习_VGG_3

目标 知道VGG网络结构的特点能够利用VGG完成图像分类 2014年&#xff0c;牛津大学计算机视觉组&#xff08;Visual Geometry Group&#xff09;和Google DeepMind公司的研究员一起研发出了新的深度卷积神经网络&#xff1a;VGGNet&#xff0c;并取得了ILSVRC2014比赛分类项目…