2015-04-25 4 views
0

Я уже задал этот вопрос и не получил соответствующего ответа.Использование SQLCipher с Android

У меня есть приложение, опубликованное в Play Маркете, которое активно использует базу данных SQLite.

Теперь мне нужно защитить базу данных с помощью SQLCipher. Вот некоторые проблемы, с которыми я столкнулся.

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

(Я хотел бы короткий учебник по этому вопросу)

2) Как я должен проверить, если база данных в незашифрованном виде, а затем, как я могу зашифровать его? Должен ли я делать это только один раз? Какая должна быть лучшая практика?

(возможный дубликат не ответить на этот вопрос)

3) Когда я зашифровать свои существующие незашифрованную базу данных, сделать SQLCipher создать новую базу данных? Если да, как мне управлять этим новым? А как насчет моей старой базы данных, которая незашифрована? Он все еще остается там?

(Это объяснение также не предусмотрено в дубликате вопроса)

+0

Вы можете (вкратце) добавить щедрость в свой другой вопрос. Он нахмурился, чтобы снова задать «тот же» вопрос. –

+0

@ArtjomB. Этот вопрос во многом отличается от возможного дубликата. Этот вопрос более подробно и охватывает широкий спектр сценариев. –

+0

В этом случае он слишком широк. Придерживайтесь одного вопроса за пост, а не 8 (sic!). –

ответ

7

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

У вас нет. Помимо прочего, вы должны настроить свой пользовательский интерфейс, чтобы спросить у пользователя парольную фразу и убедиться, что вы можете запросить эту кодовую фразу по мере необходимости (например, пользователь возобновляет задачу из некоторой «внутренней» активности, а не только когда пользователь запускает вашу приложение через значок запуска).

Я хотел бы краткий учебник по этому

Во-первых, это не то, как работает переполнение стека.

Во-вторых, приличное покрытие SQLCipher для Android принимает много больше, чем может поместиться в один ответ на переполнение стека. Например, у меня есть an 18-page chapter on the subject in my book. Этот ответ уже длиннее большинства вопросов Android, и я бы не стал обвинять людей в том, что они закрывают этот вопрос как слишком широкий.

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

Попробуйте открыть его с помощью SQLCipher классов Android с "" как ключевой фразой. Если он открывается успешно, база данных не зашифрована. Если это не удается, либо база данных повреждена или зашифрована, и без правильной кодовой фразы вы не можете отличить эту разницу.

как его зашифровать?

Основной подход:

  • Открыть зашифрованную базу данных

  • Используйте оператор ATTACH SQL прикрепить пустой файл, чтобы служить в качестве новых зашифрованной базы данных, обеспечивая нужную кодовую фразу, и присвоение имени прикрепленной базы данных encrypted в вашей базе данных.

  • Запустить SELECT sqlcipher_export('encrypted') в открытой (незашифрованной) базе данных, которая будет экспортировать данные из незашифрованной базы данных в зашифрованную (за исключением версии схемы базы данных, которая обрабатывается на последующих этапах)

  • Звоните getVersion() на открытое (в незашифрованном виде) базы данных и удерживать это значение для бита

  • Закрыть незашифрованые базы данных

  • Открыть зашифрованную базу данных, используя ваш пароль

  • вызова setVersion() на прил rypted базы данных, снабжая значение, которое вы кэшированные из getVersion() в незашифрованном базе

  • Закройте зашифрованную базу данных

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

Этот вспомогательный метод реализует вышеупомянутый подход:

public static void encrypt(Context ctxt, String dbName, 
          String passphrase) throws IOException { 
    File originalFile=ctxt.getDatabasePath(dbName); 

    if (originalFile.exists()) { 
     File newFile= 
      File.createTempFile("sqlcipherutils", "tmp", 
           ctxt.getCacheDir()); 
     SQLiteDatabase db= 
      SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(), 
             "", null, 
             SQLiteDatabase.OPEN_READWRITE); 

     db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';", 
            newFile.getAbsolutePath(), passphrase)); 
     db.rawExecSQL("SELECT sqlcipher_export('encrypted')"); 
     db.rawExecSQL("DETACH DATABASE encrypted;"); 

     int version=db.getVersion(); 

     db.close(); 

     db= 
      SQLiteDatabase.openDatabase(newFile.getAbsolutePath(), 
             passphrase, null, 
             SQLiteDatabase.OPEN_READWRITE); 
     db.setVersion(version); 
     db.close(); 

     originalFile.delete(); 
     newFile.renameTo(originalFile); 
    } 
    } 

В интересах полного раскрытия информации я не пробовал это через некоторое время, и поэтому, возможно, вам придется немного поработать.

Должен ли я делать это только один раз?

Только вы можете ответить на этот вопрос, так как никто здесь мало знает о вашем приложении.

Когда я шифрую существующую незашифрованную базу данных, создайте SQLCipher новую базу данных?

Да.

Если да, то как мне управлять этим новым?

Только вы можете ответить на этот вопрос, так как никто здесь не знает о вашем приложении.

А как насчет моей старой базы данных, которая незашифрована? Он все еще остается там?

Да, хотя вы можете удалить его, если и когда вы закончите с ним.

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