Подтвердить что ты не робот

Android Secure Storage

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

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

Есть ли встроенный класс Android для выполнения этой задачи? Или мне нужно искать сторонние библиотеки? Использование NDK также приемлемо для меня.

Update:

Я надеялся найти Android API для хранения, который гарантирует, что только приложение, которое хранит некоторую информацию, может вернуть его обратно. Android OS могла бы обеспечить это на основе подписи подписи приложения. Таким образом мое приложение может генерировать случайный ключ при первом запуске и хранить его в защищенном хранилище для последующего использования. Есть ли для этого API?

4b9b3361

Ответ 1

Есть ли встроенный класс Android для выполнить эту задачу?

Кроме java.io.File, no.

Или я должен искать стороннюю сторону библиотеки?

Вы можете попробовать, но я подозреваю, что большинство будет выглядеть как решение, которое вы уже отклонили. Большинство защищенных хранилищ данных включают пароли и предполагают, что пароли хранятся в другом месте (например, в голове пользователя). Например, OI Safe имеет систему на основе Intent, позволяющую приложениям хранить вещи в сейфе, но затем пользователь участвует в разблокировании безопасного, IIRC.

Ответ 2

Одним из решений, если вы в конечном итоге используете KeyStore API, является генерация вашего пароля динамически во время выполнения каждый раз, когда приложение должно получить доступ к KeyStore. Если вы основываете свой алгоритм пароля на простой, но изменяемой переменной, связанной с конкретной установкой, такой как MEID устройства (или другой определенный идентификатор физического устройства, полученной во время выполнения), вы можете предоставить ключ блокировки, который становится все труднее подобрать.

Пример: используйте идентификатор с физического устройства, разрежьте три позиции и добавьте их в конечную позицию в строке идентификатора, а затем добавьте свои инициалы в строку программно. Я бы подумал, что такой подход даст слой безопасности, который не может быть легко сломан, если взломщик не знает, как вы сделали ключ (т.е. Имеет свой исходный код).

MEID = MEID + "fluffy" + "2008";

Где MEID - это строка с некоторым идентификатором с устройства, "пушистый" - это имя вашего лучшего друга, а "2008" - год важного события в вашей жизни. Затем подайте эту новую строку в массив, проанализируйте число, которое вам подходит (например, в тот день, когда вы получили лицензию на свои драйверы), захватите три символа и опустите эти символы в конце строки. Закрепите переднюю часть строки до количества позиций, которые вам нужны для вашего ключа, и уходите. Это не должно быть очень сложной для процессора задачей, поэтому с некоторым кодом отказоустойчивости для переменных вы сможете запустить это в своем основном процессе даже из-за слишком большого беспокойства по поводу получения ANR из системы. Если вы действительно хотите получить froggy, преобразуйте строку в бит в какой-то момент и "побитовой op" изменения. Viola, низкий накладной, динамический ключ, который уникален для устройства, на котором он запущен!

EDIT:

Как отмечал @RedWarp, декомпиляция .apk всегда находится в пределах возможностей для любого объектного кода с правильными инструментами и мотивацией. Если "ключевое" поколение - действительно важный процесс, то абстрагирование ключевого гена вне сферы действия приложения является обязательным.

Реальная проблема, которую я пытаюсь сделать с этим ответом, заключается в том, что мысль о минимальной безопасности может идти вперёд. Более сильная безопасность более глубока, чем простой ответ от меня.

Ответ 3

Здесь вы должны различать ключи и данные приложения.

"KeyKairStore" KeyKairStore и KeyGenerator хранит ключи, которые они генерируют из вашего приложения под псевдонимом в KeyStore, и связывает ключи с вашим приложением. Если у устройства есть "безопасное оборудование", вы можете указать, что он будет использоваться, и там будут храниться ключи.

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

см. https://developer.android.com/training/articles/keystore.html

Для ваших личных данных приложения, если я понимаю "API Android для хранения, который гарантирует, что только приложение, которое хранит некоторую информацию, может вернуть его обратно...", вы можете посмотреть на них:

https://developer.android.com/guide/topics/data/data-storage.html#filesInternal https://developer.android.com/guide/topics/data/data-storage.html#db