2012-03-01 2 views
10

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

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

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

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

ответ

8

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

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

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

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

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

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

+1

Я пошел с этим решением, каждый раз, когда приложение запускается/открывается, я запрашиваю у пользователя контакт, я создам свой ключ на основе этого и отброшу его, как только приложение будет закрыто снова. – Pieter888

12

Вы сказали ...

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

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

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

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

+2

Боюсь, что вы правы , Я решил использовать метод PBKDF2 Ranhiro Cooray, упомянутый, поэтому я пошел с этим ответом, но все же отличный ответ спасибо :) – Pieter888

1

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

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