I have a database file reset in the assets
file.
How can I use SQLCipher
to encrypt the database in android?
I have a database file reset in the assets
file.
How can I use SQLCipher
to encrypt the database in android?
This is going to be a bit complicated. Since the database file format is different between SQLite and SQLCipher for Android, and since you want to ship an unencrypted database, you will have to do a few things.
First, I'd get SQLiteAssetHelper
going, to deliver the unencrypted database to your environment.
Then, use standard SQLCipher for Android to create an empty-but-encrypted database.
Next, you will need to implement the code to copy the data out of the packaged-but-unencrypted database and insert it into the empty-but-encrypted database.
Once that is all done, you can close and delete the packaged-but-unencrypted database and just use the encrypted one.
This might make a useful extension to SQLiteAssetHelper
, someday...
unencrypted
to assets folder but it doesn't when I add a zipped encrypted
file to assets folder. –
Archean SqliteAssetHelper
. Now if I have to re-insert the data to another db file then there is no point in using this approach. –
Archean sqlcipher_export()
function you can use that gets you most of the way there. I have that wrapped up in an encrypt()
utility method here: github.com/commonsguy/cwac-loaderex#usage-sqlcipherutils –
Semitrailer sqlicipherutils
class , this did it for me. And when the file from assets folder is copied to sdcard then using the mentioned function SQLCipherUtils.encrypt(mContext,Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+DBName, "password");
I encrypt the file and then read contents from the encrypted db. This all works good on 2.3 and 4.1 , but creates issue with ICS
as all the tables are not copied from the database from assets even if we keep encryption aside. –
Archean SqliteCipher
is used actually I am not using it right now. What I have the issue with is SqliteAssetHelper
here. As when I install the app and the db is copied from assets folder to sdcard then all of the tables inside the Dash.db file are not copied, but only a few. I can't get the issue, Are there any prerequisites while creating a db file from sqlite Browser
. –
Archean They cover how to use SQLCipher in detail on their website here
Basically you download their binaries, set them up in your project and then use their SQLiteDatabase class instead of the standard android SQLiteDatabase class.:
import info.guardianproject.database.sqlcipher.SQLiteDatabase;
The following code excerpt can be used to create multiple tables in an SQLite Cipher database:
Use these imports:
import java.sql.SQLException;
import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
/** Helper to the database, manages versions and creation */
public class DBAdapter extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "Test";
private static final int DATABASE_VERSION = 1;
// Table name
public static final String TABLE_1 = "Table1";
public static final String TABLE_2 = "Table2";
// Column names for Table1 table
static final String KEY_PASSWORD = "password";
static final String KEY_USER = "user";
// Column names for Table2 table
static final String KEY_EVENT = "event";
static final String KEY_USERNAME = "username";
public DBAdapter(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql1 = "create table " + Table_1 + " (" + KEY_USER + " text primary key, " + KEY_PASSWORD + " text not null);";
String sql2 = "create table " + Table_2 + " (" + KEY_EVENT + " text primary key, " + KEY_USERNAME + " text not null FOREIGN KEY(" + KEY_USERNAME + ") REFERENCES " + TABLE_1 + "(" + KEY_USER + "));";
db.execSQL(sql1);
db.execSQL(sql2);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion >= newVersion){
return;
}
String sql = null;
if (oldVersion == 1)
sql = "alter table " + TABLE_1 + " add note text;";
if (oldVersion == 2)
sql = "";
Log.d("EventsData", "onUpgrade : " + sql);
if (sql != null)
db.execSQL(sql);
}
public Cursor getAllUsers(String username, SQLiteDatabase db){
return db.query(TABLE_1, ...);
}
public Cursor getAllEvents(String event, SQLiteDatabase db){
return db.query(TABLE_2, ...);
}
}
Now you can do all the CRUD methods for both tables. Just make sure that each method has an SQLiteDatabase
as an argument as shown in the getAllUsers()
method.
© 2022 - 2024 — McMap. All rights reserved.
SQLiteAssetHelper
to handle the package-the-database-in-assets part. – Semitrailer