Справочная информация:
Я работал над приложением Android, которое хранит данные в локальной базе данных как мой любимый проект. В последнее время я решил, что хочу защитить приложение паролем и зашифровать базу данных. Теперь я знаю о сложностях шифрования базы данных на лету и (учитывая ожидаемую схему использования моего приложения) решил просто зашифровать весь файл базы данных, а не пытаться сохранить зашифрованное значение столбца или тому подобное. До сих пор я внедрил систему, которая будет запрашивать пароль при каждом запуске приложения или всякий раз, когда пользователь удаляется от моей активности (чтобы учесть, что пользователь нажимает клавишу «Домой», и приложение не удаляется своевременно).
В настоящее время я пытаюсь решить, как именно хэшировать пароль и где его хранить. Учитывая, что все должно храниться на устройстве, я в основном трактую хэши и соли паролей как уже скомпрометированные, так как любой, кто потратил 10 минут на чтение, может получить root права на данное устройство и получить доступ к моей базе данных / настройкам.
Я разработал то, что, по моему мнению, все еще должно обеспечивать очень надежную защиту, учитывая вышеизложенные предположения. Я хотел получить обратную связь от сообщества, чтобы увидеть, является ли мое решение жизнеспособным или есть ли лучший способ.
Моя идея состоит в том, чтобы сгенерировать 10 различных случайных значений соли при первом запуске приложения. Эти значения будут сохранены с фактическим окончательным хешем пароля в настройках приложения (а не в базе данных). Обратите внимание, что будет только один пароль, и он используется как для аутентификации пользователя, так и для расшифровки базы данных. При каждом вызове пароль хешируется следующим образом:
- Пароль открытого текста хешируется.
- Хешированный пароль запускается по тому же алгоритму контрольной суммы, который используется для стандартных штрих-кодов UPC. Это приведет к значению от 0 до 9 (включительно).
- Эта контрольная сумма будет использоваться в качестве индекса для массива значений солей. Это единственное значение соли будет добавлено к текущему хешу.
- Новое значение hash + salt будет затем хешировано, и шаги 2 - 3 будут повторены.
Я полагаю, что выполнение этого процесса за 5 итераций дало бы 5 ^ 10 различных комбинаций соли в отдельности и сделало бы практически невозможным любой тип атаки радугой. После проверки правильности окончательного хеш-кода его можно использовать для расшифровки базы данных.
Теперь я понимаю, что это звучит как излишество для простого приложения для мобильного телефона. Это. Но, так как это мой любимый проект, почему бы и нет?
Вопрос:
Итак, после этой стены текста этот подход разумен или есть лучший путь? Я думаю, что при этом месте самым слабым звеном будет атака в памяти или я ошибаюсь? Любая обратная связь с благодарностью.
Заранее спасибо.
-cheers