Intereting Posts
Camera.takePicture () не работает на моих телефонах JB & GB & Froyo Android SDK менеджер не показывает пакеты, которые будут установлены Android: изменить цвет с цвета на цвет Android Не удалось создать экземпляр активности: не нашел класс на пути Как я могу видеть длинный макет в предварительном просмотре в Android Studio Android dialogFragment «иногда», не отображающий веб-просмотр Как получить событие на анкете checkbox check change? Android-система WebView нарушает приложения Android! «Могилы отключены на JB MR2 + пользовательских сборках» TextInputLayout не отображается, когда View добавлен программно Как объявить глобальные переменные в Android? Как записывать аудио на веб-странице (iOS, Android, ПК / Mac) – без вспышки Альтернатива для String.join в Android? Настройка прозрачности кнопок в android ACCESS_FINE_LOCATION Разрешения AndroidManifest не предоставляются Как выполнять задачу Async повторно через определенные промежутки времени

Лучший способ защитить данные, чувствительные к приложениям Android?

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

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

Solutions Collecting From Web of "Лучший способ защитить данные, чувствительные к приложениям Android?"

Хранение конфиденциальных данных на устройстве

Это очень зависит от вашей аудитории. Как правило, ОС Android запрещает приложениям обращаться к файлам друг друга (то есть к базам данных, файлам предпочтений, обычным файлам, хранящимся в частном каталоге приложения), через проверенные разрешения файлов Linux. Однако на корневых устройствах приложение может получить доступ root и прочитать все. Несколько вещей, о которых нужно подумать:

  1. Если вы знаете, что у ваших пользователей не будет root (например, если вы не распространяете приложение через Android Market, но только в своей компании или что-то в этом роде), вы можете просто полагаться на безопасность на базе файловой системы Android.
  2. Если пользователь получает root-доступ, он будет очень осторожен, какое приложение он дает, что привилегия
  3. Если приложение получает доступ с правами root, это может нанести большой урон. Информация в вашем приложении может быть наименьшей из проблем пользователя.
  4. Rooting приводит к нулевой гарантии. В том числе в приложениях. Вы не можете нести ответственность за утечку информации о корневом телефоне.

В заключение, если ваша информация не чувствительна к супер-пуперу (например, информация о кредитной карте), я бы предложил просто придерживаться стандартной безопасности, предоставляемой Android (т. Е. Сохранить все в текстовом виде, зная, что другие приложения не могут получить к нему доступ).

В противном случае шифрование – это путь. Это не на 100% безопасно (хакер может декомпилировать ваше приложение и выяснить, как расшифровать данные), но это большая боль, чтобы взломать и остановить большинство хакеров. Особенно, если вы запутываете свой код чем-то вроде ProGuard .


Передача конфиденциальных данных с сервера на устройство

У вас есть несколько вариантов. Прежде всего, всегда используйте HTTPS. После включения HTTPS, вот две дополнительные меры безопасности, которые я бы предложил:

  1. Используйте систему ключей API. Включите этот ключ API во все ваши запросы и проверьте его на стороне сервера, прежде чем отправлять ответ. Помните, что, поскольку вы используете HTTPS, злоумышленник не сможет просто использовать сетевой сниффер, чтобы узнать ваш ключ API. Тем не менее, это довольно легко понять, если кто-то декомпилирует ваше приложение, поэтому вы можете запутать его еще больше (помимо использования ProGuard). Например, вы можете оставить ключ API разбитым на части вокруг вашего кода (например, как статические члены в двух или трех классах). Затем, когда вы отправляете запрос, вы просто объединяете все эти части. Вы даже можете применить другое преобразование (например, смещение бит), чтобы еще сложнее было разобраться с декомпилированным кодом.
  2. Вы можете генерировать ключ каждый раз, когда вы отправляете запрос. Этот ключ будет сгенерирован с использованием некоторой логики, которую вы только знаете, чтобы вы могли реализовать ее как на стороне клиента, так и на стороне сервера. Например, запрос может включать следующие параметры:
    time=1321802432&key=[generated-key]
    Где generated-key генерируется из параметра time . Например: md5(time + salt) . Когда сервер получает этот запрос, он может сделать две вещи:
    1. Убедитесь, что key действительно равен md5(time + salt) (обратите внимание, что только клиент и сервер знают соль, и его можно запутать аналогично вышеприведенному ключу API) и
    2. Убедитесь, что time прошло слишком далеко (например, если прошло более 1-2 минут, считайте, что запрос недействителен).

Второй метод более полезен, если вы также выполняете простые HTTP-запросы, где каждый может видеть отправленные параметры. Кроме того, гораздо сложнее выяснить, из декомпилированного кода. Особенно, если вы распределяете логику вычисления ключей для нескольких классов.

Однако обратите внимание, что ничто не делает невозможным взломать ваше приложение. Вы можете запутывать столько, сколько захотите, если хакер действительно решит добраться до ваших данных, он сможет это сделать, декомпилируя ваше приложение и потратив много бессонных ночей, проходящих через ваш код и выясняющих, как формируются запросы. Единственный реальный способ защитить ваши данные – попросить вашего пользователя ввести пароль, помимо выполнения всей работы, о которой я писал выше. Вы не можете получить пароль, который существует только в чей-то (пользовательской) голове из декомпилированного кода :).

(Пришел благодаря поиску Google)

В последнее время я много разбираюсь в этой проблеме, и эта страница пришла очень много благодаря поисковым запросам Google и Bing. Широко принятая процедура безопасного хранения данных на устройстве состояла в использовании сильного алгоритма шифрования, такого как AES. Более сложный вопрос: «AES требует безопасного ключа. Что вы делаете с ключом?»

Недавно Google анонсировала облачное решение для хранения приложений, поэтому вы можете рассмотреть возможность хранения ключа там, если это позволяет ситуация. В противном случае кажется, что получить ключ вне устройства, как на сервере, лучше. Если вы можете сделать попытку пользователя в ПИН-код, это будет работать лучше всего. Вы можете сделать вывод пароля, чтобы сохранить пароль, и вы можете повторить вывод, чтобы проверить пароль

Без части «пользовательский штамповка в ПИН» я не нашел много хороших ответов на этот вопрос. Однако НЕ ТРЕБУЙТЕ КОДИРОВАТЬ КЛЮЧ, ЕСЛИ ВЫ ДОЛЖНЫ ХРАНИТЬ ОДИН С ПРИЛОЖЕНИЕМ. Как минимум, сгенерируйте ключ, используя защищенный генератор паролей и / или функцию деривации, такую ​​как PBKDF2 (функция вывода 2 на основе пароля).

Если я правильно прочитал сообщения, Google сказал, что один из подходов состоит в том, чтобы сгенерировать ключ после запуска приложения в первый раз, сохранить ключ через флаг MODE_PRIVATE для большого количества операций ввода-вывода файлов и использовать его в качестве ключа. Вы также можете получить другие ключи на основе этого главного ключа, и NIST на самом деле предлагает что-то по этим линиям.

Не доверяйте методу мастер-ключа, я оставлю вам. Этот ключ будет отображаться на корневом устройстве. Я также признаю, что я все еще изучаю проблему

Использовать SSL на HTTPS для передачи данных вместо HTTP, вам нужно настроить сертификаты на веб-сервере, не очень уверенно, как это работает.

Если вы действительно обеспокоены данными, тогда еще зашифруйте его с помощью уникального алгоритма перед отправкой и расшифровкой его, когда он достигнет приложения. Я думаю, это все об этом. Если вам не нужно что-то действительно сильное, тогда создайте собственный протокол на основе TCP и / или используйте другой порт. Может быть, это поможет

http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.android.com/reference/javax/net/ssl/package-summary.html http://blog.synyx.de/2010/06/ Android-и-самозаверяющие-SSL-сертификаты /

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

Если телефон не укоренен, не должно быть способа извлечь данные из него.

Если вы хотите в значительной степени обеспечить, чтобы пользователь не мог видеть данные, кроме как глядя на ваше приложение, тогда шифрование – это действительно единственный способ. Даже «защищенное» хранилище доступно пользователю, если устройство коренится. Даже шифрование не полностью безопасно, так как вам нужно дешифровать данные в какой-то момент, чтобы отобразить их. Вы будете отговаривать случайного браузера, но не определенного хакера.