gpt4 book ai didi

android - 加密数据库(sqlcipher,cacheword)的备份和恢复?

转载 作者:搜寻专家 更新时间:2023-10-30 20:56:31 25 4
gpt4 key购买 nike

我开始使用 sqlite 数据库开发一个 android 应用程序。一段时间后,我想要的大部分功能都实现了,我决定插入数据库加密。为此,我结合使用了 sqlcipher 和 cacheword 来存储和管理加密 key 。

为了备份和恢复我的数据库,我在未加密数据库的情况下使用了简单的方法,将 mydb.db 文件复制到 sdcard,反之亦然。通过加密,这两种方法首先都在没有错误消息的情况下完成了他们的工作,但在恢复后,应用程序无法使用我的数据库。

备份方法:

public static void BackupDatabase() throws IOException {
boolean success = true;
File file = null;
file = new File(Environment.getExternalStorageDirectory() +"/myapp");

if(file.exists()) {
success = true;
}
else {
success = file.mkdir();
}

if(success) {
String inFileName = "/data/data/de.my.app/databases/mydb.db";
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);

String outFileName = Environment.getExternalStorageDirectory()+"/myapp/mydb.db.backup";
// Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);
//transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer))>0) {
output.write(buffer, 0, length);
}

output.flush();
output.close();
fis.close();
}
}

恢复方法:

public static void RestoreDatabase(Context context) throws IOException {
try {

// Set the folder on the SDcard
File directory = new File(Environment.getExternalStorageDirectory()+"/myapp/");
boolean directoryB = new File(Environment.getExternalStorageDirectory()+"/myapp/", "/mydb.db.backup").exists();

if (directoryB == true) {

OutputStream myOutput;
myOutput = new FileOutputStream("/data/data/de.my.app/databases/mydb.db");

// Set the input file stream up:

InputStream myInputs = new FileInputStream(directory.getPath()+ "/mydb.db.backup");


// Transfer bytes from the input file to the output file
byte[] buffer = new byte[1024];
int length;
while ((length = myInputs.read(buffer))>0) {
myOutput.write(buffer, 0, length);
}


// Close and clear the streams
myOutput.flush();

myOutput.close();

myInputs.close();

}
else {
Toast.makeText(context, "Wiederherstellung gescheitert! Datei nicht gefunden! Ordner/Datei existiert nicht?", Toast.LENGTH_SHORT).show();
}

} catch (FileNotFoundException e) {
Toast.makeText(context, "Wiederherstellung gescheitert! Datei nicht gefunden! Ordner/Datei existiert nicht?", Toast.LENGTH_LONG).show();

// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
Toast.makeText(context, "Wiederherstellung gescheitert!", Toast.LENGTH_SHORT).show();


// TODO Auto-generated catch block
e.printStackTrace();
}
}

部分错误信息:

10-01 22:52:58.050: I/Database(4223): sqlite returned: error code = 26, msg = file is encrypted or is not a database
10-01 22:52:58.050: E/Database(4223): CREATE TABLE android_metadata failed
10-01 22:52:58.060: E/Database(4223): Failed to setLocale() when constructing, closing the database
10-01 22:52:58.060: E/Database(4223): net.sqlcipher.database.SQLiteException: file is encrypted or is not a database
10-01 22:52:58.060: E/Database(4223): at net.sqlcipher.database.SQLiteDatabase.native_setLocale(Native Method)
10-01 22:52:58.060: E/Database(4223): at net.sqlcipher.database.SQLiteDatabase.setLocale(SQLiteDatabase.java:2102)
10-01 22:52:58.060: E/Database(4223): at net.sqlcipher.database.SQLiteDatabase.<init>(SQLiteDatabase.java:1968)
10-01 22:52:58.060: E/Database(4223): at net.sqlcipher.database.SQLiteDatabase.openDatabase(SQLiteDatabase.java:901)
10-01 22:52:58.060: E/Database(4223): at net.sqlcipher.database.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:944)
10-01 22:52:58.060: E/Database(4223): at net.sqlcipher.database.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:107)
10-01 22:52:58.060: E/Database(4223): at info.guardianproject.cacheword.SQLCipherOpenHelper.getWritableDatabase(SQLCipherOpenHelper.java:53)

如何实现使用加密数据库的副本作为备份?


sqlcipher_export 的使用有助于备份我的数据库。但是现在我在恢复数据库方面遇到了新问题。

我尝试了以下代码:

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(backupFile, backuppassword, null);
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + mCacheWord.getEncryptionKey() + "';");
...

错误信息如下:

10-30 00:56:42.845: I/Database(14407): sqlite returned: error code = 26, msg = statement aborts at 5: [ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';] file is encrypted or is not a database
10-30 00:56:42.845: E/Database(14407): Failure 26 (file is encrypted or is not a database) on 0x63bdedb0 when executing 'ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';'

我不知道如何解决这个问题。你能帮帮我吗?

最佳答案

您应该使用 sql_export 函数来备份、解密和加密您的数据库。对于上述错误,解决方案是在标志中使用 NO_LOCALIZED_COLLATORS,但我不确定您从哪里得到上述错误。您应该在尝试使用 SQLiteDatabase 类连接到数据库的地方遇到上述错误。你能在恢复后发布连接到数据库的代码吗

关于android - 加密数据库(sqlcipher,cacheword)的备份和恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19126060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com