Безопасное хранение изображений Android
Я разрабатываю приложение для Android 2.2, которое позволяет пользователю покупать и загружать изображения с веб-сервера.После того, как он загрузит эти изображения, только это приложение должно иметь возможность просматривать эти изображения. Один из возможных способов, который я мог придумать, состоял в том, чтобы зашифровать и сохранить изображения на SD-карте.
Но меня беспокоит то, что даже после шифрования эти файлы будут видны для приложений проводника файлов(которые могут удалять/переименовывать/перемещать файлы). Можно ли хранить эти файлы в SD-карте таким образом, что она не видна другим приложениям?Существует функция прямой блокировки в BlackBerry(http://www.blackberry.com/developers/docs/4.5.0api/net/rim/device/api/io/file/ExtendedFileConnection.html).после того, как файл будет сохранен на sd-карту с помощью этого метода, он будет виден только соответствующему приложению и device.Is есть что-то подобное для android?
Будет ли целесообразно хранить изображения в базе данных sqlite.База данных файл не виден другим приложениям в телефоне.(PS: там будет большое количество изображений)
Можно ли сохранить файлы изображений как .файлы asec. Есть ли api, который преобразует файл в .формат asec?Я понимаю.файлы asec не будут показаны исследователями файлов.
Пожалуйста, не могли бы Вы направить меня или предложить идеальное решение для этого сценария.
5 ответов:
Существует решение для хранения данных на SD-карте таким образом, что невозможно увидеть файлы в окне просмотра файлов на устройстве на некорневом телефоне.
Решение состоит в том, чтобы сохранить данные в папке данных приложений и активировать автоматический выбор местоположения для вашего приложения в манифесте. Это позволяет пользователю выбрать, где сохранить приложение внешнее или внутреннее, и все изображения находятся в частной папке, принадлежащей приложению.
Есть только один недостаток. То пользователь может удалить все файлы через Диспетчер приложений. Она будет предупреждена, что это может сломать приложение, но если нет способа повторно загрузить изображения, пользователь потеряет все купленные предметы, если приложение будет удалено или пользователь решит, что было бы хорошо удалить данные приложения.
На корневом телефоне, однако, изображения могут быть скопированы из личной папки. Поэтому вам следует подумать о том, чтобы каким-то образом зашифровать изображение. Шифрование, однако, не так просто, потому что пользователь может всегда старайтесь извлечь ключ шифрования из исходного кода или сетевого трафика.
Как разработчик приложения вы являетесь гостем на устройстве пользователя. Пользователь имеет больше контроля над устройством, чем вы когда-либо будете иметь. Нет места, чтобы спрятать секретный ключ, необходимый для шифрования. Вы вынуждены играть красиво, возможно, вы ищете "(в)безопасности, хотя неизвестность".
Вы можете хранить файлы в базе данных, если нет ограничений на размер БД.
Или вы можете хранить изображения в одном контейнере (например. наша виртуальная файловая система SolFS) и извлечь их из этого контейнера. Пользователь все равно сможет скопировать контейнер. Одним из вариантов здесь является шифрование контейнера с использованием некоторого идентификатора устройства (например, IMEI-кода) в качестве части ключа шифрования.
Если телефон укоренен, пользователь может делать практически все, так как Грач указал, неясность становится важная часть уравнения.
И еще один вариант-создать пользовательский формат файла для ваших изображений, чтобы только ваше приложение могло загружать данные изображения. Опять же, вы можете зашифровать такие файлы, используя идентификатор устройства, чтобы "привязать" образ к устройству.
Обратите внимание, что в настоящее время интеллектуальная собственность (включая изображения) лицензируется пользователю, а не устройству. Или, по крайней мере, пользователь имеет право перемещать IP между несколькими своими системами (скажем, не более 3 устройств). Вы можете обработайте это также, зашифровав изображение случайным ключом, а затем зашифровав случайный ключ с помощью IMEI+salt для каждого устройства (таким образом, у вас будет случайный ключ, зашифрованный, скажем, 3 раза). Затем пользователь может перемещать файл между своими системами. Конечно, это не единственный способ позволить пользователю перемещать файлы между своими устройствами.
Вы можете обернуть изображения в файл, где они зашифрованы и бесполезны для других программ, а затем в вашем приложении вы де-криптируете файл изображения и отображаете его. Другой метод заключается в том, чтобы вставить водяной знак при хранении на SD, а затем удалить водяной знак при отображении в программе.
Можно зашифровать файлы изображений, а затем сохранить их на SD-карте. Это не мешает пользователю найти/скопировать / удалить файл. Вы можете использовать класс
File
и использоватьFile.setReadOnly()
, но я думаю, что он требует корневого доступа. В любом случае у пользователя будут те же права доступа, что и у вашего приложения.Самый безопасный способ-создать полноценный онлайн-просмотрщик.