Защитете поверителността на потребителите си: Защита на приложенията за Android за разработчици

Автор: Peter Berry
Дата На Създаване: 20 Lang L: none (month-012) 2021
Дата На Актуализиране: 16 Юни 2024
Anonim
Ольга Шкряба — Разработка библиотеки для мобильных приложений
Видео: Ольга Шкряба — Разработка библиотеки для мобильных приложений

Съдържание


Ако ще виси на аудиторията си и репутацията ви на надежден разработчик на Android, тогава трябва да вземете сериозно сигурността на приложението Android като програмист.

Ако приложението ви някога изтича частни данни, тогава рискувате да загубите голяма част от аудиторията си. Днешните потребители на мобилни технологии разбират, че най-добрият начин да се защитят от несигурно приложение е да го премахнете от устройството си. Тежките нарушения на данните също все по-често се съобщават от медиите, така че възприемането на полов подход към мобилната сигурност може да доведе до много лоша публичност.

Залозите са големи и с новите злонамерени приложения се пускат непрекъснато, има все по-голям шанс приложението ви да споделя устройство със злонамерен софтуер и злонамерен код на трети страни.

Възприемането на помия подход към мобилната сигурност може да доведе до много лоша публичност.

За щастие, Android има широка гама от вградени функции за защита, които могат да помогнат да се затворят данните на вашите потребители. В тази статия ще проучим всички основни функции за поверителност, които са включени в платформата Android, както и допълнителни инструменти, техники и най-добри практики, които можете да използвате, за да гарантирате, че вашите данни за частните приложения остават лични.


Актуализирайте зависимостите си

Не са рядкост модерните мобилни приложения да използват множество библиотеки, SDK и много други различни зависимости. Новите версии на тези зависимости често съдържат корекции на грешки, кръпки и други функции за защита, така че трябва да се уверите, че използвате най-новите версии, докато разработвате приложението си.

Преди да разгърнете приложението си, също така е добре да извършите една последна проверка, само за да сте сигурни, че няма актуализации.

Ако приложението ви използва Google Play Services, можете да проверите дали на устройството на потребителя е инсталирана най-новата версия и след това да задействате актуализация, ако е необходимо.

За да проверите дали услугите на Google Play на устройството са актуални, обадете се на метода installIfNeeded () на доставчика на клас ProviderInstaller. Ако е налична актуализация, тогава този метод ще хвърли изключение за оторизация и потребителят ще бъде подканен да актуализира Google Play Services на своето устройство.


Ограничете вашите заявки за разрешение

Ако приложението ви няма достъп до разрешение, няма нулев шанс да злоупотреби с някоя от чувствителните данни или функционалности, свързани с това разрешение. Ограничаването на достъпа до чувствителни разрешения също може да направи приложението ви по-малко привлекателна цел за хакери, така че е важно да поискате възможно най-малко разрешения.

Преди да направите който и да е искания за разрешение, трябва да помислите дали има начин да постигнете същия резултат, без да имате достъп до това разрешение. Например, ако трябва да запазите някои данни, тогава можете да получите достъп до локално хранилище, без да изисквате разрешения, вместо да се опитвате да ги запишете външно, което изисква WRITE_EXTERNAL_STORAGE разрешение.

Като алтернатива може да използвате намерения за предаване на задача на приложение, което вече има необходимите разрешения (и). Например, вместо да поискате разрешенията READ_CONTACTS и WRITE_CONTACTS, можете да делегирате задача на приложението Контакти:

Intent contactIntent = ново намерение (Intent.ACTION_INSERT); contactIntent.setType (ContactsContract.Contacts.CONTENT_TYPE); if (contactIntent.resolveActivity (getPackageManager ())! = null) {startActivity (contactIntent); }

Трябва също да се откажете от всички разрешения, които приложението ви вече не изисква, което може значително да намали количеството на чувствителни данни и функции, до които приложението ви има достъп по всяко време.

Нека вашите потребители решат: Показване на програма за избор на приложение

Защо да губите време и енергия за преоткриване на колелото? Подразбиращите се намерения ви позволяват да изпълнявате задачи в сътрудничество с приложения на трети страни, като намалявате количеството код, който трябва да напишете, за да осигурите цялата желана от вас функция. Предавайки задача на друго приложение, можете също да можете да намалите броя на разрешенията, които вашето приложение изисква.

Неявните намерения могат да ви спестят един тон време, но те също ви дават нула контрол над това, кое приложение отговаря на вашата заявка. Ако едно несигурно или злонамерено приложение на трета страна отговори на вашето мълчаливо намерение, има вероятност по невнимание да изложите личните данни на потребителя на трета страна.Ако поверителността на потребителя е нарушена в резултат на заявление на трета страна, тогава вашето приложение може да се разглежда като виновно по асоциация.

Когато издавате неявно намерение, трябва да показвате приложението за избор на Android, когато е възможно.

Представяйки на потребителя списък на всички приложения, които могат да отговорят на това намерение, вие им предоставяте възможност да изберат приложение, на което той лично се доверява. Въпреки че няма гаранция, че всеки отделен потребител ще избере разумно, това може да намали шансовете да споделяте данни с ненадеждно приложение.

Когато издавате намерение, трябва да проверите дали потребителят има множество приложения, които могат да се справят с това намерение. Ако приемем, че са налични няколко съвместими приложения, след това можете да покажете инструмента за избор на приложение, като се обадите на createChooser () и го предадете на startActivity ():

Intent myIntent = ново намерение (Intent.ACTION_SEND); списък possibleActivitiesList = queryIntentActivities (намерение, PackageManager.MATCH_ALL); // Проверете дали повече от едно приложение може да се справи с това намерение // ако (възможноAAtivityList.size ()> 1) {// Показване на инструмента за избор на приложение // String title = getResources (). GetString (R.string.app_chooser_title); Намерен избор = Intent.createChooser (намерение, заглавие); startActivity (за избор); } else if (intent.resolveActivity (getPackageManager ())! = null) {startActivity (намерение); }

Обърнете внимание, че никога не трябва да използвате косвено намерение за стартиране на услуга, тъй като няма да имате контрол върху това коя услуга отговаря на вашето мълчаливо намерение.

Избягвайте външно съхранение

Трябва да се уверите, че всички данни, които съхранявате на устройството на потребителя, не са достъпни за други приложения - освен ако не предоставите изрично одобрение на тези приложения.

Файловете, записани във външно хранилище, могат да се четат и могат да се записват в световен мащаб, така че всички данни, които записвате във външно хранилище, могат да бъдат достъпни и модифицирани от всяко друго приложение. Също така няма гаранция, че външен носител за съхранение ще остане свързан с текущия смартфон или таблет. Ако приложението ви записва във външно хранилище, потенциално можете да запазвате чувствителни потребителски данни на SD карта, която по-късно ще бъде премахната и поставена в устройството на някой друг!

Освен ако нямате конкретна причина да не го направите, винаги трябва да запазвате данни във вътрешното хранилище, където те са в пясъчна кутия и ще бъдат достъпни за приложението ви по подразбиране. Освен това, ако потребителят деинсталира приложението ви, всички файлове на приложението ви ще бъдат изтрити автоматично от вътрешното хранилище, така че не е нужно да се притеснявате да не оставяте зад себе си чувствителна информация.

В следния фрагмент записваме данни във вътрешното хранилище:

final String FILE_NAME = "user_data.txt"; String fileContents = "Този текстов файл съдържа чувствителни потребителски данни"; опитайте (BufferedWriter писател = нов BufferedWriter (нов FileWriter (нов файл (getFilesDir (), FILE_NAME)))) {write.write (fileContents); } улов (IOException e) {// За да направите: Изключване на обработката //}

Ако данните са особено чувствителни, тогава можете да осигурите допълнителна сигурност на приложението за Android, като криптирате файловете с ключ, който не е достъпен за вашето приложение, например ключ, който е поставен в Keystore и защитен с парола, която не се съхранява на устройството.

Използвайте новия достъп до директорията на Android

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

Въпреки че можете да поискате разрешението READ_EXTERNAL_STORAGE, това често ще предостави на приложението ви достъп до повече данни, отколкото е необходимо. Приложението е невъзможно да управлява неправилно данни, до които няма достъп, така че трябва да се опитате да сведете до минимум количеството информация, до което приложението ви може да има достъп, когато е възможно.

Вместо да поискате разрешението READ_EXTERNAL_STORAGE, можете да поискате достъп до конкретна директория. Това обхват на директорията изисква да използвате класа StorageManager и след това да създадете намерение чрез извикване на метода StorageVolume.createAccessIntent () на този екземпляр. Например в следния фрагмент имаме достъп до външната директория за снимки:

StorageManager newStorageManager = (StorageManager) getSystemService (Context.STORAGE_SERVICE); StorageVolume volume = newStorageManager.getPrimaryStorageVolume (); Намерение намерение = обем.createAccessIntent (Environment.DIRECTORY_PICTURES); startActivityForResult (намерение, заявка_код);

Ако потребителят предостави на приложението ви достъп до тази външна директория, Android ще извика вашия onActivityResult () отмяна с резултат от кода RESULT_OK, плюс намерение, съдържащо URI за исканата директория.

Никога не кеширайте чувствителните потребителски данни

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

За кешове, по-големи от 1 MB, можете да използвате getExternalCacheDir (), който ще върне пътя към специфична за приложението директория, където можете да съхранявате вашето кеширано съдържание.

Ако решите да кеширате, просто трябва да знаете, че всяко приложение, което има разрешение WRITE_EXTERNAL_STORAGE, може потенциално да запише в тези файлове, така че трябва никога съхранявайте частна или чувствителна информация в кеша, ако ви интересува сигурността на приложението Android.

Защитете ключовете си от неоторизирана употреба

Системата Android Keystore ви позволява да съхранявате криптографски ключове в контейнер, което затруднява извличането на тези ключове от устройството.

Android Keystore гарантира, че ключовият материал никога не влиза в процеса на кандидатстване, така че дори ако процесите на приложението ви са компрометирани и нападателят успее да получи достъп до вашите ключове, той няма да може да извлече ключовия си материал.

Можете също така да използвате Keystore, за да ограничите кога и как могат да се използват вашите ключове, например можете да ограничите използването на клавиши до определени криптографски режими или да се нуждаете от автентификация на потребителя.

Направете вашите ContentProviders частни

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

Освен ако изрично не е необходимо да споделяте данни с приложение на трета страна, трябва да направите всичките си ContentProviders частни, като ги маркирате като android: exported = false в Manifest на приложението си. Ако приложението ви е съвместимо с Android 4.1.1 или по-нова версия, особено важно е да маркирате личните си ContentProviders като android: export = false, тъй като всички ContentProviders са публични по подразбиране.

Отпечатайте пръстови отпечатъци на вашите потребители с биометрично удостоверяване

Преди да разрешите на потребител да получи достъп до някоя от чувствителната информация или функции на приложението ви, трябва да проверите самоличността му, като поискате техните идентификационни данни.

Потребителските идентификационни данни могат да бъдат под формата на ПИН или парола, но винаги, когато е възможно, е много по-сигурно да се извърши биометрично удостоверяване, например чрез искане на пръстовия отпечатък на потребителя.

последвам всичко мрежови най-добри практики

За разлика от по-малко преносимите устройства като настолни компютри, ние често свързваме нашите смартфони и таблети към необезпечени безжични мрежи, като безплатен обществен Wi-Fi. За да запазите поверителността на потребителя, трябва да подходите към всички мрежови транзакции като по своята същност рисковани, особено когато предавате потребителски данни.

Винаги, когато трябва да извършите мрежова транзакция, важно е да следвате всички най-добри практики в мрежата на Android:

  • Използвайте HTTPS вместо HTTP, винаги когато се поддържа на сървъра.
  • Никога не се доверявайте на данни, изтеглени от несигурни протоколи, включително всякакви отговори, издадени срещу HTTP.
  • Използвайте подходящи протоколи за чувствителни данни, като HttpsURLConnection.
  • Когато автентификацията е възможна, използвайте Android IPC механизъм, като например услуга.
  • Използвайте инструмента за защита на мрежата с отворен код Nogotofail, за да тествате приложението си срещу известни уязвимости и неправилни конфигурации на TLS / SSL. Nogotofail включва тестове за често срещани проблеми за проверка на SSL сертификати, HTTPS и TLS / SSL грешки в библиотеката, проблеми с ясен текст и проблеми за премахване на SSL и STARTTLS. За повече информация разгледайте страницата на GitHub на Nogotofail.
  • Където е възможно, избягвайте зареждането на код извън вашия APK, тъй като това увеличава шансовете някой в ​​мрежата да промени кода ви, докато той се предава.

Използвайте WebViews с повишено внимание

Компонентът WebView може да консумира HTML и JavaScript, така че ако използвате WebViews неправилно, приложението ви ще бъде уязвимо за често срещани проблеми със сигурността на уебсайта, като скриптове на различни сайтове.

Ако използвате WebView неправилно, приложението ви ще бъде уязвимо за често срещаните проблеми със сигурността в мрежата.

За да се защитят потребителите на Android, компонентът WebView не изпълнява JavaScript по подразбиране. Въпреки това, ако е необходимо, можете да активирате JavaScript, като използвате getSettings (), за да изтеглите WebSettings и след това изпълнете метода setJavaScriptEnabled ():

WebView myWebView = (WebView) findViewById (R.id.webview); WebSettings webSettings = myWebView.getSettings (); webSettings.setJavaScriptEnabled (истина);

Дори ако трябва да активирате JavaScript, трябва да избягвате използването на addJavaScriptInterface (), когато това е възможно, тъй като този метод инжектира предоставения Java обект в компонента WebView. Ако приложението ви е инсталирано на устройство, работещо с Android 4.2 или по-ранна версия, потенциално този метод може да позволи на JavaScript да манипулира приложението ви.

Ако използвате WebViews, тогава не трябва да разрешавате на потребителите да се придвижват до всеки уебсайт, който не контролирате, но по-специално трябва никога използвайте метода addJavascriptInterface (), ако потребителят потенциално може да премине към неподдържана уеб страница, тъй като това е огромен риск за сигурността на приложението за Android.

Никога не трябва да използвате метода addJavascriptInterface (), ако потребителят потенциално може да премине към ненадеждна уеб страница.

Ако вашият компонент WebView има достъп до някакви лични данни, тогава може да искате периодично да изтривате всички файлове, които се съхраняват локално, като използвате метода clearCache (). Като алтернатива можете да попречите на приложението ви да кешира чувствително съдържание, като използвате заглавието на страната без кеш.

Управление на слоя за сигурни сокети на приложението ви (SSL)

SSL е често срещан компонент на криптирана комуникация между клиенти и сървъри. Ако приложението ви използва SSL неправилно, тогава злонамерените трети страни потенциално могат да прихванат данните на приложението ви, докато те се предават по мрежа.

Обикновено сървърът е конфигуриран със сертификат, съдържащ публичен ключ и съвпадащ частен ключ. Като част от комуникацията между SSL клиента и сървъра, сървърът ще подпише сертификата си с криптография с публичен ключ. Възможно е обаче трета страна да генерира свой сертификат и частен ключ, така че вашият клиент също трябва да има един или повече сертификати, на които се доверява. Ако сертификатът не е зададен, приложението ви не трябва да се доверява на сървъра.

За да се улесни този процес, сървърите често се конфигурират със сертификати от добре познати сертификационни органи (CA). Към нивото на API 17, Android поддържа над 100 CA, които се актуализират с всяко издание. При издаване на сертификат за сървър, CA ще подпише сертификата на сървъра с помощта на неговия личен ключ и след това клиентът може да провери дали сертификатът е издаден от CA, който е известен и се доверява на платформата Android.

Ако приложението ви комуникира с уеб сървър, който има сертификат, издаден от доверен CA, тогава можете да направите заявката си в няколко реда код:

URL URL адрес = нов URL адрес („https://www.google.com“); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection (); urlConnection.connect (); InputStream in = urlConnection.getInputStream ();

Въпреки това, има някои сценарии, при които горният код ще доведе до изключение:

  • CA, издал сертификата на сървъра, е неизвестен. В този сценарий можете да научите HttpsURLConnection да се доверява на този набор от CA.
  • Сертификатът на сървъра е бил самоподписан, което означава, че сървърът действа като свой собствен CA. За самоподписани сертификати можете да създадете свой собствен TrustManager, въпреки че трябва да сте сигурни, че вашият самоподписан сертификат има силен ключ.
  • В конфигурацията на сървъра липсва междинен CA. Много обществени организации не подписват директно сертификати на сървъри. Android се доверява само на root roots, така че сървърът ще трябва да изпрати верига от сертификати от сървъра CA чрез всички междинни продукти, необходими за достигане на root. Ако не можете да конфигурирате сървъра да включва междинния CA в сървърната верига, тогава едно възможно решение е да създадете свой собствен TrustManager.

Създаване на файл за конфигуриране на мрежова сигурност: Доверие на персонализирани CA

Ако искате приложението ви да използва нов или персонализиран CA, тогава трябва да създадете файл за конфигурация на мрежовата сигурност, където да укажете вашите настройки за сигурност на мрежата.

За да създадете файл за конфигурация на мрежовата сигурност:

  • Ако проектът ви вече не съдържа XML папка, ще трябва да създадете такава. Щракнете върху контролния бутон на Res Resource на вашия проект и изберете New> Directory Resource Directory.
  • Създайте нов XML файл с ресурси във вашата XML директория, който ще служи като файл за конфигурация на вашата мрежова сигурност. Именувам този файл network_config.
  • Отворете вашия мрежов конфигурационен файл и посочете, че целият трафик към следните домейни трябва да използва HTTPS:

// Деактивиране на изчистения текст // // Прилагане на това правило към домейна и всичките му поддомейни // my.domain.com ... ... ...

Вече можете да определите набора от персонализирани сертификати, на които приложението ви трябва да се доверява. Например, ако искате да се свържете с хост, който използва самостоятелно подписан CA, тогава ще добавите следното към вашия конфигурационен файл за мрежова сигурност:

my.domain.com // Комплект доверителни котви за сигурни връзки // // Набор от сертификати за елементи на котва за доверие и източникът на тези сертификати //

Не забравяйте да декларирате файла за конфигуриране на мрежовата сигурност във вашия Манифест:

След това ще трябва да добавите надеждни CA в res / raw / trusted_cas на вашия проект във формат PEM или DER.

Доверете се на допълнителни CA, когато е подходящо

И накрая, може да искате да се доверите на допълнителни CA, които не са известни на платформата Android. За да увеличите броя на CA, на които приложението ви се доверява, ще трябва да посочите множество източници на сертификати:

Никога не изпращайте чувствителни данни чрез SMS

Ако трябва да предавате данни от сървър към приложението си, тогава трябва да използвате Google Cloud Messaging (GCM) и IP съобщения, а никога некриптирания SMS протокол.

Прочетете също: Разработка на Android: Как да се обаждате, да получавате SMS и да извличате контактите на потребителите

Също така никога не трябва да изпълнявате чувствителни команди, като използвате SMS s, тъй като SMS се предават като намерения за излъчване, което означава, че всяко приложение с разрешение READ_SMS ще има достъп до съдържанието им.

Защитавайте от заплахи за сигурността с API на SafetyNet

SafetyNet предоставя набор от услуги и API, които можете да използвате, за да защитите приложението си от заплахи за сигурността, като подправяне на устройства, злонамерени URL адреси и фалшиви потребители.

Android поддържа следните API на SafetyNet:

  • API за удостоверяване на SecurityNet, Този API за злоупотреба ви позволява да получите достъп до устройството с Android, където работи приложението ви, така че можете да определите дали вашите сървъри взаимодействат с истинско устройство.
  • API на SafeNet Safe Browsing, Можете да използвате този API за да определите дали Google е класифицирал определен URL адрес като известна заплаха.
  • SafetyNet reCAPTCHA API, Тази услуга включва API на reCAPTCHA, който можете да използвате, за да защитите приложението си от заплахи като спам и злонамерен трафик. Ако API подозира, че приложението ви взаимодейства с бот, той ще служи на CAPTCHA, който получателят трябва да разреши, преди да може да продължи да използва приложението ви.
  • Безопасен API за проверка на приложения, Ако приложението ви съдържа чувствителни потребителски данни, тогава можете да използвате този API, за да взаимодействате с функцията за проверка на приложенията на устройството и да проверите дали устройството не съдържа злонамерени приложения. Ако устройството не е защитено, можете да извършите известно ограничение на щетите, като деактивирате всички чувствителни функции на приложението си. Само не забравяйте, че въпреки че SafetyNet ще предупреждава потребителите за всички потенциално вредни приложения, които открие, няма гаранция, че потребителят действително ще деинсталира тези приложения. Освен това непрекъснато се пускат злонамерени приложения и хакерите винаги измислят нови и гениални начини да се промъкнат под радара, така че дори и дадено устройство да премине теста на SafetyNet, не трябва да приемате, че няма вредни приложения на устройството.

За повече информация относно API на SafetyNet, включително инструкции как да ги използвате във вашите приложения, разгледайте официалните документи за Android.

Използвайте защитено с Android потвърждение за чувствителни транзакции

Ако приложението ви трябва да извърши чувствителна транзакция, като например извършване на плащане, тогава можете да използвате защитено с Android потвърждение на устройства, работещи с Android 9 (ниво 28 на API) или по-високо.

Всеки път, когато потребителят се опита да извърши чувствителна транзакция, защитеното с Android потвърждение ще покаже подкана да ги помоли да приемат кратко изявление. Ако потребителят одобри това изявление, тогава можете да подпишете с помощта на ключ от Android Keystore.

За повече информация, плюс инструкции как да внедрите защитено с Android потвърждение, вижте официалните документи за Android.

Android 10: Стартирайте директно вградения DEX код

На устройства с Android 10 (ниво 29 на API) и по-нови версии е възможно да стартирате вграден DEX код директно от APK файла на приложението си, което може да помогне за предотвратяване на атака, дори ако хакерът успее да подправи локално компилирания код на устройството.

Прочетете също: Проучване на Android Q: Добавяне на известия за балончета към приложението ви

За да активирате тази нова функция за защита, отворете Manifest на вашия проект и добавете следното към елемента:

След това ще трябва да създадете APK файл, съдържащ некомпресиран DEX код, до който ART може да получи директен достъп. Отворете своя файл build.gradle и добавете следното:

aaptOptions {noCompress dex}

Само не забравяйте, че ART ще използва компилатора JIT при стартиране на приложението ви, което може да повлияе на работата на приложението ви.

Обобщавайки

В тази статия разгледахме всички най-добри практики, инструменти, API и техники, които можете да използвате, за да поддържате сигурността на приложението си за Android.

Имате ли съвет за повишаване на сигурността на приложението ви? Не забравяйте да споделите съветите си в коментарите по-долу!

Въпреки че според съобщенията Huawei работи върху собствената си мобилна ОС, компанията може би търси другаде своя алтернатива за Android. Твърди се, че нещо друго е руска вилка на ailfih O, съобщаваЗ...

Изпълнителният директор на групата за потребителски бизнес Ричард Ю не е известен със скромността си, когато става дума за възможностите на хардуера на Huawei. Не се задоволява с твърдението, че Mate ...

Нашите Публикации