Android - сохранение конфиденциальных данных в базе данных sqlite

Мне нужно хранить конфиденциальные данные в базе данных sqlite в приложении Android.

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

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

И если это не так, то какой (почти) отказоустойчивый способ хранения конфиденциальных данных в базе данных sqlite?

Ответ 1

Симметричная криптография требует ключа для шифрования и того же ключа для дешифрования. Об этом нет.

Не храните ключ в коде, потому что его можно декомпилировать (как вы уже сказали).

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

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

И если срок действия истек, пользователь должен снова ввести пароль.

Я не проверял SQLCipher полностью, но он говорит, что использует AES-256. AES является симметричным криптографическим алгоритмом и ему нужен ключ для шифрования и один и тот же ключ для дешифрования.

Ответ 2

Ты сказал...

Я не хочу просить пользователя заполнить ключ, я просто хочу его работать на нее самостоятельно. Потому что я боюсь обратного проектирования я не хотите также вводить ключ шифрования в код.

К сожалению, вам нужно сделать одну из этих вещей (ну, наверное). Вы можете попросить пользователя ввести пароль, а затем извлечь из него ключ, используя алгоритм, разработанный для этой цели (известный как Password Based Encryption - PBE - и Android содержит некоторые хорошие стандартные алгоритмы PBE). Вы можете сохранить ключ в своем коде или в качестве ресурса в своем APK, но тогда кто-то сможет его обработать. Вы можете сделать это и обфускать свой код, что замедлит обратный процесс разработки, но вы не можете сделать его невозможным (вашему коду нужно будет определить ключ в какой-то момент, так что просто вопрос злоумышленника выяснить, как это делается она).

Другие подходы, которые были рассмотрены здесь, включают принуждение вашего клиента к подключению обратно к серверу для извлечения ключа по сети... но тогда что произойдет, если сетевое подключение будет прервано и что мешает серверу выдавать ключ кто-нибудь, как злоумышленник? Ну, тогда вы можете использовать взаимно аутентифицированный SSL, чтобы обеспечить доступ только вашему клиенту... но тогда вам нужно сохранить закрытый ключ SSL на стороне клиента... это точно такая же проблема, что и сейчас.:)

Итак... суть в том, что вам нужен ключ (или что-то подобное) для шифрования/дешифрования данных. Вы можете сохранить его и сделать его сложнее, чтобы кто-то смог его обработать. Вы можете причинить неудобства пользователю и ввести их в пароль. Но... вам нужно это секретное знание.

Ответ 3

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