2014-01-07 4 views
2

Я использую следующий фрагмент кода для шифрования и расшифровки базы данных, которую я могу зашифровать, но когда я пытаюсь расшифровать, я получаю следующее исключение. упомянутые здесь documentation и TestCases тоже все еще сталкиваются с той же проблемой.Шифровать/расшифровать существующую базу данных с помощью SQLCipher в Android

Исключение:

sqlite returned: error code = 26, msg = file is encrypted or is not a database 
CREATE TABLE android_metadata failed 
Failed to setLocale() when constructing, closing the database 
net.sqlcipher.database.SQLiteException: file is encrypted or is not a database 

Encrypt:

private static void ConvertNormalToSQLCipheredDB(Context context, 
String startingFileName, String endingFileName, String filePassword) 
throws IOException { 
    File mStartingFile = context.getDatabasePath(startingFileName); 
    if (!mStartingFile.exists()) { 
    return; 
    } 
    File mEndingFile = context.getDatabasePath(endingFileName); 
    mEndingFile.delete(); 
    SQLiteDatabase database = null; 
    try { 
    database = SQLiteDatabase.openOrCreateDatabase(MainApp.mainDBPath, 
    "", null); 
    database.rawExecSQL(String.format(
    "ATTACH DATABASE '%s' AS encrypted KEY '%s'", 
    mEndingFile.getAbsolutePath(), filePassword)); 
    database.rawExecSQL("select sqlcipher_export('encrypted')"); 
    database.rawExecSQL("DETACH DATABASE encrypted"); 
    database.close(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } finally { 
    if (database.isOpen()) 
    database.close(); 
    mStartingFile.delete(); 
    } 
} 

Расшифровать:

private void decryptDatabase() { 
    File unencryptedFile = getDatabasePath(PhoneNumbersDatabase.DATABASE_NAME); 
    unencryptedFile.delete(); 
    File databaseFile = getDatabasePath("encrypt.db"); 
    SQLiteDatabaseHook hook = new SQLiteDatabaseHook() { 
    public void preKey(SQLiteDatabase sqLiteDatabase) { 
    sqLiteDatabase 
     .rawExecSQL("PRAGMA cipher_default_use_hmac = off;"); 
    } 

    public void postKey(SQLiteDatabase sqLiteDatabase) { 
    } 
    }; 
    SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
    databaseFile, "test123", null, hook); // Exception 
    if (database.isOpen()) { 
    database.rawExecSQL(String.format(
    "ATTACH DATABASE '%s' as plaintext KEY '';", 
    unencryptedFile.getAbsolutePath())); 
    database.rawExecSQL("SELECT sqlcipher_export('plaintext');"); 
    database.rawExecSQL("DETACH DATABASE plaintext;"); 
    android.database.sqlite.SQLiteDatabase sqlDB = android.database.sqlite.SQLiteDatabase 
    .openOrCreateDatabase(unencryptedFile, null); 
    sqlDB.close(); 
    database.close(); 
    } 

    databaseFile.delete(); 
} 
+0

Взгляните на эти сампели. Это объяснение: https://github.com/sqlcipher/android-database-sqlcipher/tree/master/dist/SQLCipherForAndroid-SDK/samples/basic/example – Tobrun

+0

Когда я использую метод шифрования, подобный вашему, я сталкиваюсь с исключением база данных заблокирована! Вы можете мне помочь? –

ответ

4

Вам не нужно устанавливать cipher_default_use_hmac - off в событии preKey при попытке расшифровки базы данных. Он не отключается при шифровании базы данных, поэтому HMAC включается для каждой страницы базы данных. Попробуйте удалить SQLiteDatabaseHook из функции дешифрования. Кроме того, рассмотрите возможность присоединения к обсуждению SQLCipher Mailing List.

+0

Спасибо за ответ Ник ... как-то я смог понять это ... я приму этот ответ для объяснения. –

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