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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的