当前位置:   article > 正文

Sqlite数据库加密方法_sqlite数据库怎么加密

sqlite数据库怎么加密

方法一:对sqlite中的数据进行加密

对数据库中插入的字段内容先进行AES、MD5等加密后在插入到数据库中,在使用时先从数据库中取出数据,然后在解密在使用这种方式好是好,但是有些致命的问题不能绕过,如果要对某个字段进行模糊查询操作,那么该字段就不能加密,否则的话你不能对该字段进行模糊查询操作;这样一来该字段还是要暴漏出来,别人还是能看到一些东西的

方法二: 利用SQLCipher开源框架
使用第三方库的开源库,SQLCipher这个开源框架不错,SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,关于这个库的使用请看我的另一篇文章使用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

  1. public class DBHelper extends SQLiteOpenHelper {
  2. public DBHelper(Context context) {
  3. super(context, "person.db", null, 1);
  4. }
  5. @Override
  6. public void onCreate(SQLiteDatabase sqLiteDatabase) {
  7. sqLiteDatabase.execSQL("create table student(ID INTEGER PRIMARY KEY AUTOINCREMENT" +
  8. ",name varchar(10),age integer)");
  9. }
  10. @Override
  11. public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
  12. }
  13. }

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

2.DBOperator.java

  1. public class DBOperator {
  2. private static DBOperator mInstance;
  3. private DBHelper mHelper;
  4. private static SQLiteDatabase database;
  5. public DBOperator(Context context){
  6. mHelper = new DBHelper(context);
  7. database = mHelper.getWritableDatabase("abcd");
  8. }
  9. /**
  10. * 单例模式获取对象
  11. * @param context
  12. * @return
  13. */
  14. public static DBOperator getInstance(Context context){
  15. if(mInstance == null){
  16. mInstance = new DBOperator(context);
  17. }
  18. return mInstance;
  19. }
  20. /**
  21. * 插入数据到student表
  22. * @param name 姓名
  23. * @param age 年龄
  24. */
  25. public static void insert(String name,int age){
  26. ContentValues values = new ContentValues();
  27. values.put("name",name);
  28. values.put("age",age);
  29. database.insert("student",null,values);
  30. }
  31. /**
  32. * 查询数据库中的所有数据
  33. */
  34. public void query(){
  35. Cursor c = database.query("student", null, null, null, null, null, null);
  36. if(c!=null){
  37. while(c.moveToNext()){
  38. String name = c.getString(c.getColumnIndex("name"));
  39. int age = c.getInt(c.getColumnIndex("age"));
  40. System.out.println("===========name: "+name);
  41. System.out.println("===========age: "+age);
  42. }
  43. }
  44. }
  45. }

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

3。MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private DBOperator instance;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. SQLiteDatabase.loadLibs(this);
  7. setContentView(R.layout.activity_main);
  8. instance = DBOperator.getInstance(this);
  9. }
  10. public void click(View view){
  11. switch (view.getId()){
  12. case R.id.add:
  13. instance.insert("lxn",10);
  14. break;
  15. case R.id.query:
  16. instance.query();
  17. break;
  18. }
  19. }
  20. }

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

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

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

四.安全性验证

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

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

然后我们通过工具打开

这里写图片描述

这里报了和上面一样的错。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/492424
推荐阅读
相关标签
  

闽ICP备14008679号