1.需要用到SQLCipher ,它是目前比较流行的一款开源的SQLite加密工具 SQLCipher,对数据文件进行加密,当然微信也在使用。 SQLCipher是完全开源的,其代码托管在github上。SQLCipher使用256-bit AES加密,由于其基于免费版的SQLite,主要的加密接口和SQLite是相同的,也增加了一些自己的接口。它有一个缺点就是使用该库之后会导致Apk会变大6M左右。下面主要说明在代码中如何使用SQLCipher的提供的接口。
1.下载库文件:点击下载
2.解压文件可以得到所需要的库文件,都在在lib和assets文件夹下 :
3.导入到Android工程中 :
a.首先将assets目录下的icudt46l压缩包拷贝到对应Android工程下的assets目录下 :
b. 导入sqlcipher.jar包
c.将lib下面文件夹中的so库导入到对应Android工程中:
4.使用SQLCipher数据库
SQLCipher数据库用法相比于Android原生数据库用法,除了引入的包不一样了,其它的用法和传统的SQLiteOpenHelper都是完全相同的。只是导包的时候替换成SQLCipher的数据库文件,如下:
import net.sqlcipher.Cursor;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
所有有关数据库的代码,只要修改引入的包成SQLCipher的包,就可以完美替换(原先的代码不需变动),在用法上只两个注意点就可以了,其余的一模一样。下面介绍两个不同点,其余的数据库操作用法一样。
a.初始化时需要初始化库:必须先调用:
SQLiteDatabase.loadLibs(context);
然后再执行数据库相关的操作,建议在Application中初始化,或者在初始化单例SQLiteOpenHelper的时候初始化。
b.获取数据库db对象时需要传入key:
db = sqLiteOpenHelper.getWritableDatabase(password);
这里在调用getWritableDatabase()方法的时候传入了一个字符串参数,它就是SQLCipher所依赖的key,在对数据库进行加解密的时候SQLCipher都将使用这里指定的key。
c.还有就是利用指定密码连接加密的数据库文件:
/**
* 连接数据库
*
* @param dbFile
*/
private void openWxDb(File dbFile) {
Context context = MyApplication.getContextObject();
SQLiteDatabase.loadLibs(context);
SQLiteDatabaseHook hook = new SQLiteDatabaseHook() {
public void preKey(SQLiteDatabase database) {
}
public void postKey(SQLiteDatabase database) {
database.rawExecSQL("PRAGMA cipher_migrate;"); //兼容2.0的数据库
}
};
try {
//打开数据库连接
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, mDbPassword, null, hook);
//查询等数据库操作
Cursor c1 = db.rawQuery("select * from table1", null);
while (c1.moveToNext()) {
String userName = c1.getString(c1.getColumnIndex("username"));
String nickName = c1.getString(c1.getColumnIndex("password"));
}
c1.close();
db.close();
} catch (Exception e) {
LogUtil.log("读取数据库信息失败" + e.toString());
// e.printStackTrace();
}
}