Android Secure Storage
Я хочу хранить небольшую, но важную информацию, такую как ключи AES, в моем приложении для Android. Каков был бы рекомендуемый способ сделать это? Я не хочу жестко кодировать ключи как часть моего приложения.
Я смотрю на KeyStore, но он не решает мою проблему. Он может хранить мои ключи, учитывая, что я могу предоставить пароль. Затем мне нужно найти безопасное место для хранения этого пароля, который совпадает с моей первоначальной проблемой.
Есть ли встроенный класс Android для выполнения этой задачи? Или я должен искать сторонние библиотеки? Использование NDK также приемлемо для меня.
Обновить:
Я надеялся найти API-интерфейс Android для хранения, который гарантировал бы, что только приложение, которое хранило некоторую информацию, может получить ее обратно. Операционная система Android могла бы обеспечить это на основе подписи приложений. Таким образом, мое приложение может сгенерировать случайный ключ при первом запуске и сохранить его в безопасном хранилище для последующего использования. Есть ли API для этого?
3 ответа
Есть ли встроенный класс Android для выполнения этой задачи?
Кроме как java.io.File
нет
Или я должен искать сторонние библиотеки?
Вы можете попробовать, но я подозреваю, что большинство будет выглядеть как решение, которое вы уже отклонили. Большинство безопасных хранилищ данных включают пароли и предполагают, что пароли хранятся в другом месте (например, в голове пользователя). Например, OI Safe имеет основанную на намерениях систему, позволяющую приложениям хранить вещи в сейфе, но затем пользователь участвует в разблокировке сейфа, IIRC.
Одним из решений, если вы в конечном итоге используете API KeyStore, является динамическая генерация пароля во время выполнения каждый раз, когда приложению требуется доступ к KeyStore. Если вы основываете свой алгоритм паролей на простой, но изменяемой переменной, привязанной к конкретной установке, такой как MEID устройства (или другой конкретный идентификатор физического устройства, полученный во время выполнения), вы можете предоставить ключ для блокировки, которая становится все более сложной. подобрать.
Пример: используйте идентификатор физического устройства, обрежьте три позиции и добавьте их в конечную позицию в строке идентификатора, затем программно добавьте свои инициалы в строку. Я думаю, что этот подход даст уровень безопасности, который не может быть легко взломан, если взломщик не знает, как вы сделали ключ (то есть имеет свой исходный код).
MEID = MEID + "fluffy" + "2008";
Если MEID - это строка с некоторым идентификатором устройства, "пушистый" - это имя вашего лучшего друга, а "2008" - год важного события в вашей жизни. Затем введите эту новую строку в массив, проанализируйте подходящее вам число (например, день месяца, в который вы получили водительское удостоверение), возьмите три символа и отбросьте эти символы в конце строки. Клип от передней части строки к числу позиций, которые вам нужны для вашего ключа, и все, и вы идете. Это не должно быть очень трудоемкой задачей, поэтому, имея некоторый код отказоустойчивости для переменных, вы сможете запускать это в своем основном процессе, даже не беспокоясь о получении ANR из системы. Если вы действительно хотите стать лягушатником, в какой-то момент преобразуйте строку в биты и выполните "побитовую операцию" изменения. Viola, динамический ключ с низкими издержками, который уникален для устройства, на котором он запущен!
РЕДАКТИРОВАТЬ:
Как указал @RedWarp, декомпиляция.apk всегда в пределах возможного для любого объектного кода с соответствующими инструментами и мотивацией. Если генерация "ключа" является действительно важным процессом, то абстрагирование генератора ключа вне области приложения является обязательным.
Реальный смысл, который я пытаюсь сделать с этим ответом, заключается в том, что небольшая предварительная мысль может помочь найти пути обеспечения минимальной безопасности. Более сильная безопасность - это больше, чем простой ответ от меня.
Здесь нужно различать ключи и данные приложения.
KeyPairGenerator и KeyGenerator AndroidKeyStore хранят ключи, которые они генерируют из вашего приложения, под псевдонимом в KeyStore и связывают ключи с вашим приложением. Если устройство имеет "защищенное оборудование", вы можете указать, что оно будет использоваться, и ключи будут храниться там.
Там нет пароля для ключей. Вы используете псевдоним, чтобы указать, какой ключ вы хотите использовать. Только ваше приложение может получить сгенерированные ключи.
см.: https://developer.android.com/training/articles/keystore.html
Что касается личных данных вашего приложения, если я понимаю "... API-интерфейс Android для хранения данных, который гарантирует, что только приложение, которое хранило некоторую информацию, может получить ее обратно. ..", вы можете посмотреть на это:
https://developer.android.com/guide/topics/data/data-storage.html https://developer.android.com/guide/topics/data/data-storage.html