Хранение секретов и учетных данных внутри приложения для Android


Я использую AWS Cognito, и мне нужно сохранить некоторые учетные данные и секреты где-то внутри моего приложения для android, чтобы использовать их позже для входа/регистрации/выхода пользователей.

Некоторые источники предложили хранить учетные данные внутри project gradle.файл свойств . Оттуда учетные данные будут получены как BuildConfig.FIELD_NAME. Могу ли я быть на 100% уверен, что они не могут быть извлечены из apk при обратном проектировании?

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

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

Итак, как я могу сделать это максимально безопасно? Я жду ваших решений! Спасибо

Редактировать: Хранилище ключей на самом деле не работает, так как я должен получить секреты откуда-то, прежде чем добавлять их в хранилище ключей

1 8

1 ответ:

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

Оттуда будут извлечены учетные данные в виде BuildConfig.ИМЯ ПОЛЯ. Могу ли я быть на 100% уверен, что они не могут быть извлечены из apk при обратном проектировании?

Я на 100% уверен, что его можно извлечь :). Java не будет шифровать никакие строки, и все они будут храниться в виде необработанного текста в файлах dex, готовых к grep'D.

Далее вам нужно будет зашифровать ключи в коде, используя статический ключ. Некоторые инструменты сделают это за вас, такие как DexGuard, Dasho, Dexprotector - вы также можете придумать свой собственный решение. Эта статья хорошо объясняет это.

Имейте в виду, что и ваше собственное решение, или решение, предоставленное сторонним инструментом, может оказаться легко обратить вспять: см. Этот пример для DexGuard. Обратите также внимание, что при расшифровке во время выполнения эти учетные данные будут ясно видны в оперативной памяти устройства, что позволит отладчику легко их считывать.

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

Затем вы можете использовать криптографию whitebox, опять же с помощью сторонних инструментов, подобных тем, которые предлагает Inside Secure. Это существенно смешает как алгоритм шифрования, так и ключ в запутанном машинном коде, что может затруднить реверсирование и отладку методов шифрования/дешифрования. Здесь вы будете включать только зашифрованные учетные данные в свое приложение, и они будут надежно расшифрованы внутри whitebox. Белый ящик, как правило, очень безопасен (но не невозможно взломать), но после расшифровки учетные данные будут ясно видны в памяти устройства. Это позволит более тщательно защитить от простой декомпиляции.

Тогда... Я не думаю, что вы можете пойти намного дальше, не привлекая аппаратное решение (KeyStore, embedded Secure Element) и сервер для резервного копирования всего.