2010-07-27 6 views
21

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

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

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

Update:

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

+2

Ну, если вы храните данные в '/ данных/данных приложения/ /', то только то, что приложение может получить доступ к нему. Это неверно, если телефон укоренен. Но кроме этого, вы должны хорошо хранить данные паролей. – Falmarri

ответ

5

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

За исключением java.io.File, no.

Или мне нужно искать третьи лица библиотеки?

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

+0

Спасибо за ответ. Это действительно не решает мою проблему, но хорошо знать ограничения. –

+0

@Szere Dyeri: «Я надеялся найти Android API для хранения, который гарантирует, что только приложение, которое хранит некоторую информацию, может вернуть его обратно». - Нет такого API в Android, извините. – CommonsWare

+2

Что значит, что такого API нет? Эта гарантия является поведением по умолчанию для всех файлов, хранящихся в приложении на внутренней памяти, поскольку каждому приложению присваивается уникальный идентификатор пользователя и режим файлов по умолчанию, создаваемый приложением, должен быть доступен только для чтения/записи с помощью uid создателя. Единственным исключением является (a) файлы, размещенные на внешнем хранилище, и (b) файлы, созданные с помощью флага, чтобы сделать их доступными для чтения/записи. Единственный способ, которым может работать другое приложение с вашим uid, - это то, что оба (a) подписаны с вашим сертификатом, и (b) у вас обоих есть тот же Android: sharedUserId. – hackbod

4

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

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

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

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

EDIT:

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

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

+1

Безопасность через неизвестность может задержать только постоянных злоумышленников. Это наверняка добавляет специи к рецепту. Он не должен использоваться как единственный жизнеспособный вариант. – Samuel

+0

@SamQuest Конечно, это не представлено как единственный жизнеспособный вариант, но это начало, чтобы заставить человека мыслить другими и уникальными способами в отношении ключевой безопасности. Но если это приложение не является финансовым приложением или другой реализацией с высокой степенью безопасности, это должно обеспечить достаточную неясность. Другим вариантом может быть дистанционное предоставление скрытого ключа через скрипт RPC или что-то в этом роде, но этот подход, вероятно, будет включать дополнительную сложность. – Kingsolmn

+2

Это довольно легко отменить .apk, и поэтому получить алгоритм – Redwarp

0

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

«KeyKeyStore KeyKairStore» и KeyGenerator хранят ключи, которые они генерируют из вашего приложения под псевдонимом в 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