[英]backup and restore of encrypted database (sqlcipher, cacheword)?
我開始使用sqlite數據庫開發一個android應用程序。 一段時間后,我所需的大多數功能都實現了,我決定插入數據庫加密。 為此,我將sqlcipher與cacheword結合使用來存儲和管理加密密鑰。
為了備份和還原數據庫,在未加密數據庫的情況下,我使用了簡單的方法將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類連接到數據庫的地方收到上述錯誤。 您可以在還原后將代碼發布到您連接到數據庫的位置嗎
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.