使用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

相关文章

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys