2013-10-01 9 views
2

Я начал разрабатывать приложение для Android, используя базу данных sqlite. Через некоторое время большинство моих желаемых функций были реализованы, и я решил вставить шифрование базы данных. Для этого я использовал sqlcipher в сочетании с cacheword для хранения и управления ключом для шифрования.резервное копирование и восстановление зашифрованной базы данных (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 '[[email protected]';] 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 '[[email protected]';' 

Я не знаю, как решить эту проблему. Вы можете мне помочь?

ответ

0

вы должны использовать функцию sql_export для резервного копирования, дешифрования и шифрования базы данных. Для вышеупомянутой ошибки решение использует NO_LOCALIZED_COLLATORS во флагах, но я точно не знаю, где вы получаете указанную выше ошибку. Вы должны получить вышеуказанную ошибку в том месте, где вы пытаетесь подключиться к базе данных, используя класс SQLiteDatabase. вы можете отправить код, где вы подключаетесь к своей базе данных после восстановления

Смежные вопросы