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

相关文章

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA