尚拙

一个分享技术、学习成长的个人博客网站

0%

使用sqlcipher加密sqlite数据库

记录一下如何将已有的sqlite数据库加密,并在Android项目中读取该加密数据库。

加密已有的数据库

这里我直接用的一个开源的sqlite数据库浏览器。

官网:https://sqlitebrowser.org/

GitHub地址:https://github.com/sqlitebrowser/sqlitebrowser

使用该工具打开要加密的数据库,工具栏选择”设置加密”,可以对数据库进行加密。

加密方式目前可以选择SQLCipher3和SQLCipher4,具体用哪个版本需要与解密的sqlcipher版本对应。

Android中解密数据库

Android中解密数据库需要用到第三方库,目前有两个版本,旧版本停止维护了,推荐用新版本。

旧版本:https://github.com/sqlcipher/android-database-sqlcipher

新版本:https://github.com/sqlcipher/sqlcipher-android

这里我们用的是最新版本的库。

1、添加依赖
implementation 'net.zetetic:sqlcipher-android:4.6.0@aar'
implementation 'androidx.sqlite:sqlite:2.2.0'

2、复制数据库

将assets中的数据库文件复制到系统目录。

private static void copyDataBase(Context context)  {
Log.i("[QDataBaseHelper]","copyDataBase start");
try {
// Open your local db as the input stream
InputStream myInput = context.getAssets().open(DB_NAME);
// Path to the just created empty db
String outFileName = DB_PATH + DB_NAME;
File file = new File(outFileName);
if (!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
// Open the empty db as the output stream
OutputStream myOutput = new FileOutputStream(outFileName);
// transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
} catch (IOException e) {
e.printStackTrace();
Log.i("[QDataBaseHelper]","IOException"+e.toString());
}
Log.i("[QDataBaseHelper]","copyDataBase complete");
}
3、读取数据库

注意这里用到的SQLiteDatabase都是依赖库的类。

import net.zetetic.database.sqlcipher.SQLiteDatabase;

public static SQLiteDatabase getDataBase() {
String password = "123456";
if (mDataBase == null) {
String path = DB_PATH + DB_NAME;
try {
mDataBase = SQLiteDatabase.openDatabase(path,password, null, 0, null);
} catch (Exception e) {
e.printStackTrace();
}
}
return mDataBase;
}

成功读取数据库后,后面的操作就跟普通数据库一样了。