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

I am struggling with How to encrypt/decrypt DB with SQLCipher.

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

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

I followed this link but not getting how to do that. http://sqlcipher.net/sqlcipher-api/#key

Мой файл DB: -

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
nl ja de

3 ответы

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

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

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

Tip: There is no need to call openOrCreateDatabase when you are using SQLiteOpenHelper, calling getWritableDatabase would do the job, also you must be having a SQLiteDatabase object which is taken from getWritableDatabase method, calling getWritableDatabase for every time you want to insert a record is not right.

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

    //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
     }

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

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

4
добавлено
У нас есть два вида Throwables, Exceptions and Errors. Иногда SQLCipher возвращает Error (если какая-либо библиотека отсутствует), а не исключение. Чтобы поймать, что вы должны использовать Throwable в выписке. Несмотря на то, что его нужно обрабатывать на нескольких уровнях, но вы всегда должны помнить о том, чтобы писать свои команды sqlcipher внутри Throwable catch, чтобы избежать сбоя вашего приложения, stackoverflow.com/questions/2274102/…
добавлено автор Hossein Shahdoost, источник
Я не уверен, почему вы рекомендуете ловить Throwable, а не Exception. Javadocs для другого Throwable subclass (т.е. Error) говорят, что неразумно ловить ошибки: docs.oracle.com/javase/6/docs/api/java/lang/Error.html
добавлено автор James Baxter, источник

Try using SQLiteDatabase.openOrCreateDatabase as described here: http://sqlcipher.net/sqlcipher-for-android/

1
добавлено
какие file.mkdir и file.delete делают там .. они обязательны для использования .. я редактирую мой код, пожалуйста, просмотрите его. Я делаю прямо сейчас или нет.
добавлено автор Unknown, источник

This may be a good place to start, https://guardianproject.info/code/sqlcipher/

And more from the Android Docs, http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onConfigure(android.database.sqlite.SQLiteDatabase)

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

0
добавлено
Извините, что вы это оживили, но @Unknown вы уже решили выполнить команду PRAGMA key ? Спасибо, мне тоже это нужно.
добавлено автор Razgriz, источник
Спасибо за ответ sean..и думаю, я использую эти вещи, которые вы разместили ... Я передаю ключ в getWritableDatabase (pass) ... это шифрование.
добавлено автор Unknown, источник
ok sean .your означает внутри onConfing (). Мне нужно сделать db.rawQuery («PRAGMA key» + некоторый ключ + «;»); ..я прав
добавлено автор Unknown, источник
Я не вижу, что вы используете метод onConfigure и устанавливаете Pragmas
добавлено автор Sean McCully, источник
О, я не знаю, я просто выхожу из документов и что знаю. Я не сделал этого конкретно. Но да, вам нужно что-то сделать в этом направлении
добавлено автор Sean McCully, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)