Как зашифровать / расшифровать в SQLCipher

Я борюсь с тем, как зашифровать / расшифровать БД с помощью SQLCipher.

В моем этом коде, откуда я должен начать. и как начать.

Пожалуйста, измените этот код, если это возможно.

Я перешел по этой ссылке, но не понял, как это сделать. http://sqlcipher.net/sqlcipher-api/

Мой файл БД:-

import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteOpenHelper;
import android.content.Context;
import android.util.Log;

public class DatabaseClass extends SQLiteOpenHelper 
{
    /**
     * Constants 
     */
    public final static String DATABASE_NAME ="mycipherdatabase.db";
    public final static String NAME ="name";
    public final static String ADDRESS ="address";
    public final static String CITY ="city";

    public static String pass = "1234";
    public DatabaseClass(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    /**
     * called once
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL( "CREATE TABLE mylistdata(_id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT, address TEXT,city TEXT);");

        Log.v("inside", "oncreate");
    }

    /**
     * called when we upgrade(change)the version number of database
     * onCreate also called after changing the version
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP Table mylistdata");
        onCreate(db);
    }
}

OtherActivity Использование этой БД:-

/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        SQLiteDatabase.loadLibs(this);
        File file = getDatabasePath(DatabaseClass.DATABASE_NAME);
        file.mkdir();
        file.delete();
        sqldb = SQLiteDatabase.openOrCreateDatabase(file,key, null);
        db = new DatabaseClass(this);

        etname = (EditText)findViewById(R.id.name);
        etadd = (EditText)findViewById(R.id.add);
        etcity = (EditText)findViewById(R.id.city);
        result = (ListView)findViewById(R.id.mylist);
    }

    /**
     *insert data in to database 
     */
    public void saveData(View v) {
        ContentValues insertData = new ContentValues();
        insertData.put(DatabaseClass.NAME, etname.getText().toString());
        insertData.put(DatabaseClass.ADDRESS, etadd.getText().toString());
        insertData.put(DatabaseClass.CITY, etcity.getText().toString());

        db.getWritableDatabase(key).insert("mylistdata", DatabaseClass.NAME , insertData);
        db.close();

        resetEditText();
        Toast.makeText(this,"Data saved", Toast.LENGTH_SHORT).show();
    }

3 ответа

Что ж, с кодом так много проблем, что я думаю, что вы должны лучше взглянуть на структуру SQLite в Android, технически Android SQLite и SQLCipher выглядят совершенно одинаково (за исключением пароля). так что если вы пишете стандартное приложение SQLite, его можно легко заменить на SQLCipher,

Я предлагаю вам прочитать эту прекрасную статью о SQLite в Android,

http://www.vogella.com/articles/AndroidSQLite/article.html

Совет: нет необходимости вызывать openOrCreateDatabase, когда вы используете SQLiteOpenHelper, вызов getWritableDatabase сделает эту работу, также вы должны иметь объект SQLiteDatabase, который берется из метода getWritableDatabase, вызывая getWritableDatabase для каждого раза, когда вы хотите вставить запись, не право.

эти части будут удалены,

     // in onCreate method
     File file = getDatabasePath(DatabaseClass.DATABASE_NAME);
     file.mkdir();
     file.delete();
     sqldb = SQLiteDatabase.openOrCreateDatabase(file,key, null);
     db = new DatabaseClass(this);

     // in saveData method
      db.getWritableDatabase(key).insert("mylistdata", DatabaseClass.NAME ,               insertData);

Вместо этого вы должны сделать что-то вроде этого

     // in onCreate method
     try{
        sqldb = new DatabaseClass(this).getWritableDatabase(key);
     }catch(Throwable e){
        // error occurred
     }

     // in insert action
     try{
        sqldb.insert("tablename", null, contentValues);
     }catch(Throwable e){
        // error occurred
     }

Таким образом, вы также можете увидеть, произошла ли ошибка. Помните, что не использовать класс Exception для ключевой фразы, только Throwable!

Также я бы не советовал закрывать соединение при каждом действии вставки, лучше позаботиться на более высоких уровнях

Попробуйте использовать SQLiteDatabase.openOrCreateDatabase, как описано здесь: http://sqlcipher.net/sqlcipher-for-android/

Это может быть хорошим местом для начала, https://guardianproject.info/code/sqlcipher/

И многое другое из Документов Android, http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

Для меня ключевым моментом было добавление jar sqlcipher в ваши андроиды и убедитесь, что вы установили секретные ключи / парольную фразу PRAGMA stmts.

Другие вопросы по тегам