Intereting Posts
Как сделать верхний или нижний колонтитул ListView недоступным для просмотра Как получить события searchview в android Как я могу использовать пользовательский шрифт во входной области метода ввода? Как публиковать имя устройства (переменная) через Wi-Fi, как это делают некоторые приложения для передачи файлов? Как я могу генерировать ресурсы XML во время выполнения на Android? Является ли com.google.android.c2dm.intent.REGISTRATION устаревшим? Облицовка Ориентация проблемы с камерой, снятой на Android-телефонах Захват stdout / stderr с помощью NDK Ошибка: значение null в записи: blameLogFolder = null Как анимировать путь на холсте – андроид Получить поддерживаемый кодек для Android-устройства Пользовательский диалог на Android: как я могу сосредоточить свое название? Android.os.networkonmainthreadexception внутри новой темы Можно ли получить доступ и обновить учетные записи Exchange? Можете ли вы создать фильтр намерения на основе запроса?

Как сохранить ключ, используемый в SQLCipher для Android

Я использую SQLCipher для Android. Я выполнил все необходимые вещи, необходимые для загрузки libs, как указано в http://sqlcipher.net/sqlcipher-for-android/

Я заметил, что вы установили пароль, то есть ключ:

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null); 

Тогда как ваш пароль защищен от хакера? Как можно получить доступ из java-файла. ?

Есть ли правильный способ хранения пароля?

Спасибо, Nibs

Solutions Collecting From Web of "Как сохранить ключ, используемый в SQLCipher для Android"

Тогда как ваш пароль защищен от хакера?

Это не. Однако жесткое кодирование кодовой фразы делает для простых демонстраций.

Есть ли правильный способ хранения пароля?

Пользователь должен предоставить кодовую фразу для пользовательской базы данных через ваш пользовательский интерфейс. Затем пользователь хранит кодовую фразу в голове пользователя или, возможно, вы объединяете то, что находится в голове пользователя, с чем-то еще для облегченной двухфакторной аутентификации (например, MAC-адрес сопряженного Bluetooth-носителя).

Я хотел бы предложить следующий подход:

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

Итак, как работает доступ к хранилищу ключей? См. Запись в блоге 1 и запись в блоге 2 и соответствующий репозиторий github . Решение доступно для Android версии 2.1 – 4.3.

Большие оговорки:

  1. Решение работает только с закрытым доступом к API, поэтому оно может сломаться в будущем.
  2. Для хранения ключей требуется пароль блокировки экрана, и все ключи стираются, если пользователь удаляет пароль блокировки экрана.

То, что упускается из виду, является тот факт, что демонстрация, данная SQLCipher, предназначена исключительно для демонстрации. Подумать, чтобы разработчик преодолел очевидное. Чуть менее очевидно, что вы не будете хранить ключ в частной локальной переменной, так как выполнение поиска строк по вашим файлам классов может выявить ваш ключ, уменьшив словарь, необходимый для успешной атаки грубой силы. Откройте файл classes.dex в шестнадцатеричном редакторе и попробуйте.

Вы не должны беспокоиться о файлах .java, поскольку там должны быть только ваши разработчики. Это файлы .class. Следующий уровень усилий – это попытка обфускации, но это только ограничивает нетерпеливость.

Взгляните на это обсуждение https://groups.google.com/forum/#!topic/sqlcipher/OkE0rUwXEb8