Android Secure Storage - PullRequest
       25

Android Secure Storage

21 голосов
/ 27 июля 2010

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

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

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

Обновление:

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

Ответы [ 3 ]

5 голосов
/ 27 июля 2010

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

Кроме java.io.File, нет.

Или я должен искать третийпартийные библиотеки?

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

4 голосов
/ 08 февраля 2011

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

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

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

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

EDIT:

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

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

0 голосов
/ 11 июля 2016

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

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

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

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

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

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

...