Как ограничить доступ к файлам на моем устройстве Android?

Идея такова.

Мое приложение позволяет пользователю слушать музыку и смотреть видео из социальной сети. Пользователь может сохранить эти файлы в кеше, чтобы иметь возможность воспроизводить их в автономном режиме. Эти данные сохраняются на SD-карту и могут быть доступны файловым менеджерам и т. д.

Я хочу ограничить доступ к этим файлам другим приложениям. Наиболее очевидным решением является шифрование данных.

Не могли бы вы порекомендовать мне какие-нибудь библиотеки или фреймворки для быстрого шифрования/описания файлов? Очень желательно шифровать файлы "на лету" во время загрузки.

Будет ли эта процедура слишком медленной и ресурсоемкой?

Может быть есть какие-то другие способы - защищенная папка в файловой системе SD или что-то в этом роде?


person Carlos    schedule 03.04.2013    source источник


Ответы (2)


Да, есть более стандартный способ сделать это.

С помощью openFileInput на своем Context и установив флаг MODE_PRIVATE, вы сможет создавать файлы и даже папки в вашем приложении. Кроме того, эти ресурсы будут полностью закрыты для вашего приложения.

ИЗМЕНИТЬ:

Большую часть времени эти файлы будут храниться в /data/data/<app_package_name>/files. То есть в памяти телефона большую часть времени, хотя это зависит от реализации.

Что касается комментария @Carlos, в котором упоминается файловый спам, да, вы можете залить NAND несколькими файлами, но /data в большинстве случаев будет смонтирован на выделенном разделе. Таким образом, в какой-то момент вы достигнете виртуального размера раздела. Посмотрите этот пост принятый ответ дает более подробную информацию об этом. Другими словами, это зависит от реализации (зависит от производителя).

person Halim Qarroum    schedule 03.04.2013
comment
Обратите внимание, что MODE_PRIVATE используется по умолчанию, поэтому достаточно просто использовать внутреннюю память (будь то через openFileInput() или getFilesDir()). - person CommonsWare; 03.04.2013
comment
Да, это правильно. Несмотря на то, что он установлен по умолчанию, всегда безопасно установить его в любом случае, чтобы обеспечить совместимость с другими версиями. - person Halim Qarroum; 03.04.2013
comment
Я так понимаю, внутреннее хранилище находится в памяти телефона. Если это так, то медиаконтент довольно быстро заспамит всю эту память. И, наконец, пользователь не сможет устанавливать новые приложения или просто получать смс. - person Carlos; 03.04.2013

Единственный вариант — использовать шифрование, если вы хотите продолжать использовать внешнее хранилище. В этом может помочь SpongyCastle. Это версия API BouncyCastle для Android.

Кроме того, вы можете переместить свои файлы во внутреннюю память, что может оказаться неосуществимым в вашем случае, поскольку медиафайлы, как правило, имеют большой размер, а внутренняя память на большинстве устройств очень ограничена. Даже если вы переместите их во внутреннее хранилище, любой пользователь с правами root сможет получить к ним доступ (или любое приложение с правами root).

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

person Raghav Sood    schedule 03.04.2013
comment
и внутренняя память на большинстве устройств очень ограничена — не начиная с Android 3.0, что означает, что на данный момент большинство устройств имеют столько же места для внутренней памяти, сколько и для внешней памяти. - person CommonsWare; 03.04.2013
comment
@CommonsWare Ха. Не думаю, что я столкнулся с этим изменением. У вас есть ссылка на список изменений? Или это упоминается в CTS? Я все еще вижу много (новых, выпущенных в течение ~ 6 месяцев) устройств с небольшим внутренним хранилищем. - person Raghav Sood; 03.04.2013
comment
Я все еще вижу много (новых, выпущенных в течение ~ 6 месяцев) устройств с небольшим внутренним хранилищем. - изменение в Android 3.0 заключалось в переключении с режима USB Mass Storage Mode на MTP для USB-соединений. Это позволило им иметь внешнее хранилище и внутреннее хранилище в одном разделе, как отдельные каталоги (для режима USB Mass Storage требуется выделенный раздел FAT32). Я никогда не видел устройство Android 3.0+, использующее выделенные разделы для внутренней или внешней памяти. Производителям, которые продолжают использовать выделенные разделы, нужно объяснить некоторые причины. - person CommonsWare; 03.04.2013
comment
Если бы вы могли назвать некоторые устройства, которые, как вы видите, имеют меньше внутреннего хранилища, чем внешнее, я могу провести дополнительное исследование. - person CommonsWare; 03.04.2013
comment
@CommonsWare Ах да. Это изменение мне хорошо известно. Вы даже сделали гостевой пост для моего сайта на нем :P Я не помню названия макушки, но у моих друзей есть парочка таких. Я вернусь к вам с названиями устройств. - person Raghav Sood; 03.04.2013
comment
Да, напишите мне по электронной почте или перезвоните сюда или что-то еще, если вы столкнетесь с устройствами, которые имеют это ограничение. Я предположил, возможно, неправильно, что все производители будут использовать один раздел, так как я ожидал, что это будет проще, не говоря уже о большей гибкости для пользователей. Если некоторые из них не являются, это хорошая информация для публикации. - person CommonsWare; 03.04.2013