Есть ли безопасное хранилище в Android через Monodroid из коробки?

Как и многие люди, я разрабатываю приложение с общей кодовой базой (Windows Store + Android + MonoTouch + [позже] WP8).

Кроме того, как и во многих приложениях, у меня есть локальное состояние, которое необходимо сохранить для этого приложения.

Одной частью информации, которую я храню, является токен аутентификации для пользователя, который выполнил вход. На платформе Windows Store я сохранил это хранилище со смесью параметров роуминга (ApplicationData.Current.RoamingSettings) для вспомогательных данных токена (имя пользователя и дата выпуска) и PasswordVault для фактического значения токена. Таким образом, токен защищен от интроспекции уровня ОС, поскольку он зашифрован ОС.

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

В результате на данный момент я просто использую интерфейс Android.Content.ISharedPreferences с помощью метода Application.Context.GetSharedPreferences для чтения и записи этих значений.

Как я исхожу в своем предположении, что платформа (MonoDroid или Android) не предлагает защищенного хранилища OOB? Является единственной альтернативой внедрению шифрования в приложении - что, конечно же, потребует выкидывания ключа шифрования в код? Или я могу захватить сертификат, используемый для подписания приложения, и использовать его в качестве ключа?

В конце концов, это не конец света, если я не могу зашифровать эти данные, так как токен ограничен во времени, но было бы неплохо, если бы я мог сделать это правильно!

Ответы

Ответ 1

Вы можете использовать его с комбинацией Keychain API (доступный в API-интерфейсе 14-го уровня) и шифрования данных с помощью Cipher API, используя сертификат из Apache Keychain.

Обратите внимание: Согласно документу "Обзор безопасности Android", нет никаких гарантий, если устройство укоренено: http://source.android.com/tech/security/index.html#rooting-of-devices

Ответ 2

Возможно, эта цитата из здесь может вам помочь:

На стороне андроида OOB не поддерживается в публичном API, поэтому вещи получить сложно. Я считаю, что это связано с тем, что у Honeycomb 3.2 нет bluez, который официально поддерживает OOB-связь, но у Google есть некоторые вид внедрения кодируется. Я верю в это, потому что если вы посмотрите на исходный код пряжи для адаптера Bluetooth и устройства Bluetooth вы можете видеть доступные методы OOB, но не документированный API.

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

Остерегайтесь, хотя многие из них не документированы, и это не очевидно, что некоторые делаю. Важными являются readOutOfBandData() в классе адаптера и setDeviceOutOfandData() в классе устройства.