Android数据库加密-SQLCipher集成

缘由

我们都知道使用SQLite来存储数据却存在着一个安全问题,就如微信之前数据库也是没加密的,后来才进行了加密。大多数的Android手机都是Root过的,而Root过的手机都可以进入到/data/data/<package_name>/databases目录下面,在这里就可以查看到数据库中存储的所有数据。如果是一般的数据还好,但是当涉及到一些账号密码,或者聊天内容的时候,我们的程序就会面临严重的安全漏洞隐患。那么今天,就让我们一起研究一下如何借助SQLCipher来解决这个安全性问题。

SQLCipher是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能,如果我们在项目中使用它来存储数据的话,就可以大大提高程序的安全性。SQLCipher支持很多种不同的平台,这里我们要学习的自然是Android中SQLCipher的用法了。

社区版集成

添加以下项进行dependencies到app/build.gradle文件:

1
compile 'net.zetetic:android-database-sqlcipher:3.3.1@aar'

商业版集成

本教程将介绍将Android的SQLCipher的二进制文件集成到现有的Android应用程序中。本教程假定开发人员具有用于Android商业二进制文件的最新SQLCipher。

我们需要将各种库文件复制到我们应用程序的根目录中。执行以下命令:

1
2
3
4
5
6
% unzip sqlcipher-for-android-v3.3.1.zip
% mkdir -p app/libs
% cp sqlcipher-for-android-v3.3.1/sqlcipher.jar app/libs
% cp -r sqlcipher-for-android-v3.3.1/armeabi \
sqlcipher-for-android-v3.3.1/armeabi-v7a \
sqlcipher-for-android-v3.3.1/x86 app/src/main/jniLibs/

最后,下面的添加到app/build.gradle该文件中的dependencies部分:

1
compile fileTree(dir: 'libs', include: ['*.jar'])

应用程序使用

接下来,我们将初始化SQLCipher,然后创建数据库文件插入记录。特别要注意的是导入包net.sqlcipher.database.SQLiteDatabase替代android.database.sqlite.SQLiteDatabase以及调用SQLiteDatabase.loadLibs(this)。请注意在其他任何数据库操作之前,先调用SQLiteDatabase.loadLibs(this)加载libs。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.demo.sqlcipher;

import java.io.File;
import net.sqlcipher.database.SQLiteDatabase;
import android.app.Activity;
import android.os.Bundle;

public class HelloSQLCipherActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
InitializeSQLCipher();
}

private void InitializeSQLCipher() {
SQLiteDatabase.loadLibs(this);
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.execSQL("create table t1(a, b)");
database.execSQL("insert into t1(a, b) values(?, ?)", new Object[]{"one for the money",
"two for the show"});
}
}

This’s all! Detail https://github.com/sqlcipher/android-database-sqlcipher