使用SQLCipher对数据库加密

2024-01-10 23:58

本文主要是介绍使用SQLCipher对数据库加密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一.概述

SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里我们要学习的自然是Android中SQLCipher的用法了。官网的地址如下:
https://www.zetetic.net/sqlcipher/
SQLCipher采用的是256位AES加密,这是一种对称加密算法,具体是如何实现不在本文的讨论范围之内。

二.使用

接下来我们看看如何使用SQLCipher,首先要下载工具包,地址如下:
https://s3.amazonaws.com/sqlcipher/SQLCipher+for+Android+v2.2.2.zip
下载好之后,我们解压,会看到assets和lib两个文件夹,我们把这两个文件夹放到项目目录下覆盖,
这里写图片描述

然后把三个jar包添加一下依赖,并且新建一个jniLibs目录,把so文件放进去
这里写图片描述
环境搭建好了,接下来我们写代码

三.代码

1.DBHelper.java

public class DBHelper extends SQLiteOpenHelper {public DBHelper(Context context) {super(context, "person.db", null, 1);}@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {sqLiteDatabase.execSQL("create table student(ID INTEGER PRIMARY KEY AUTOINCREMENT" +",name varchar(10),age integer)");}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}
}

这里我们创建数据库person.db,然后在onCreate方法中创建表student,
注意这里要继承的是net.sqlcipher.database.SQLiteOpenHelper,而不是android自带的。

2.DBOperator.java

public class DBOperator {private static DBOperator mInstance;private DBHelper mHelper;private static SQLiteDatabase database;public DBOperator(Context context){mHelper = new DBHelper(context);database = mHelper.getWritableDatabase("abcd");}/*** 单例模式获取对象* @param context* @return*/public static DBOperator getInstance(Context context){if(mInstance == null){mInstance = new DBOperator(context);}return mInstance;}/*** 插入数据到student表* @param name 姓名* @param age 年龄*/public static void insert(String name,int age){ContentValues values = new ContentValues();values.put("name",name);values.put("age",age);database.insert("student",null,values);}/*** 查询数据库中的所有数据*/public void query(){Cursor c = database.query("student", null, null, null, null, null, null);if(c!=null){while(c.moveToNext()){String name = c.getString(c.getColumnIndex("name"));int age = c.getInt(c.getColumnIndex("age"));System.out.println("===========name: "+name);System.out.println("===========age: "+age);}}}
}

这是个对数据库进行操作的类,里面我们为了演示方便,定义了两个比较简单的方法,添加数据和查询数据,唯一不同的是当我们调用getWritableDatabase这个方法获取数据库对象时,传入了一个字符串类型的参数,这个参数就代表加密的密码。

3。MainActivity.java

public class MainActivity extends AppCompatActivity {private DBOperator instance;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SQLiteDatabase.loadLibs(this);setContentView(R.layout.activity_main);instance = DBOperator.getInstance(this);}public void click(View view){switch (view.getId()){case R.id.add:instance.insert("lxn",10);break;case R.id.query:instance.query();break;}}
}

接下来我们看运行效果图:
这里写图片描述

同时我们在控制台输出查询的结果:
这里写图片描述

可以看出,数据已经正确插入了。
那么SqliteCipher是如何保证数据的安全性呢?接下来我们来验证一下。

四.安全性验证

接下来我们通过两种方式来验证数据的安全性
1.命令行 我们通过sqlite3命令来查看数据库的结构
这里写图片描述

我们进入到数据库所在的目录,然后使用.schema命令查看创建数据库时的语句,我们可以看到,已经提示出了错误信息,文件损坏或者不是数据库。
2.通过可视化工具
这里我们通过Sqlite Expert这个专业的数据库工具来查看数据库结构,首先我们要将生成的数据库文件导出来。
这里写图片描述

然后我们通过工具打开

这里写图片描述

这里报了和上面一样的错。

通过上面两种手段我们验证了数据的安全性,在外部是不能访问数据库的。

这篇关于使用SQLCipher对数据库加密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592504

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互