1) Восстановление пароля опасно. Надежность пароля подрывается ответом на вопрос, это принцип самой слабой ссылки. Взлом электронной почты Сары Пэйлин стал возможен из-за этой (очень) небезопасной функции. Кроме того, если вы храните пароль в «восстанавливаемом формате», как в блочном шифре, таком как AES, или потоковом шифре, таком как RC4, или асимметричном шифре, таком как RSA, то вы явно нарушаете CWE-257 . Если вам действительно нужна эта функция, вы должны потребовать, чтобы пользователь сбросил свой пароль, если он его не знает, то зачем вам нужно было сообщить ему?
Пароли всегда должны хешироваться с использованием безопасного дайджеста сообщений. В настоящее время многие функции дайджеста сообщений небезопасны, md4, md5, sha0 и sha1 все очень повреждены и никогда не должны использоваться для паролей. На данный момент лучше всего использовать любой член семейства sha2, я рекомендую SHA-256. В настоящее время NIST проводит конкурс на sha3, и он не будет завершен до 2012 года.
Пароли также должны быть «засолены» с большим случайным значением. Это может быть еще один столбец в вашей базе данных, который затем добавляется к простому текстовому паролю перед передачей его в функцию дайджеста сообщения. Это делает невозможными атаки по словарю, если злоумышленник не может получить соль, а также делает предварительные вычисления гораздо более ресурсоемкими для успешного проведения. Несмотря на общеизвестные знания, засолка не останавливает радужные столы, это просто означает, что вам нужен НАМНОГО БОЛЬШЕ набор радужных столов.
2) Где вы собираетесь поместить ключ для вашей зашифрованной базы данных? Sqlite - это просто файл, который вы можете зашифровать, а затем расшифровать при запуске приложения, это просто добавляет время загрузки, но во время выполнения оно будет таким же быстрым. Реальная проблема в том, что там абсолютно нет места , вы можете поместить на устройство секрет, который злоумышленник не сможет получить. Злоумышленник имеет на больший контроль над устройством, чем вы, злоумышленник может сделать джейлбрейк устройства и делать все, что ему захочется. Даже если ключ передан во время выполнения, его все равно можно получить, посмотрев на память устройства. Любые попытки зашифровать базу данных могут быть подорваны, это может усложнить задачу, но не остановит опытного хакера.