Hi guys,
After a long time, am posting one more topic. This is related SQLCipher in android.
My requirement is to secure my database if the application is not running. So, I will be encrypting the db, while it goes to background ie. onStop. And decrypting it in the onStart method. For encryption/decryption, I have used SQLCipher. You guys can go through this here, http://sqlcipher.net/sqlcipher-for-android/.
In my application, I have one database with one table.
Encryption in onStop is as follows,
After a long time, am posting one more topic. This is related SQLCipher in android.
My requirement is to secure my database if the application is not running. So, I will be encrypting the db, while it goes to background ie. onStop. And decrypting it in the onStart method. For encryption/decryption, I have used SQLCipher. You guys can go through this here, http://sqlcipher.net/sqlcipher-for-android/.
In my application, I have one database with one table.
Encryption in onStop is as follows,
@Override
protected void onStop() {
try {
ConvertNormalToSQLCipheredDB(this,
PhoneNumbersDatabase.DATABASE_NAME, "encrypt.db", "test123");
} catch (IOException e) {
e.printStackTrace();
Log.d("<<<< mydebug >>>>>", " >>>>>> : " + e.toString());
}
super.onStop();
}
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();
}
}
}
and decrypting it in onStart method is as follows,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);
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();
}
@Override
protected void onStart() {
super.onStart();
decryptDatabase();
}