Sistemul de operare Android are o mulțime de caracteristici de securitate integrate, cum ar fi sandbox-ul aplicației, protecția împotriva tamponului și atacurile de overflow întreg și zonele de memorie segregate pentru instrucțiunile și datele de program. Ca urmare, aplicațiile Android simple care nu efectuează nici un sistem de fișiere sau operațiuni de rețea pot fi adesea considerate sigure în mod implicit.
Dacă dezvoltați o aplicație mai complexă, totuși, este responsabilitatea dvs. să o asigurați și să protejați confidențialitatea utilizatorilor dvs. În acest articol, vom enumera câteva dintre cele mai bune practici pe care le puteți urma pentru a construi o aplicație sigură pentru Android care nu scapă de date sau de permisiuni și este, în general, mai puțin vulnerabilă la aplicațiile rău intenționate care ar putea fi instalate pe dispozitivul utilizatorului.
Fiecare aplicație Android are un director intern de stocare asociat cu acesta a cărui cale se bazează pe numele pachetului aplicației. Fișierele din acest director sunt foarte sigure deoarece folosesc MODE_PRIVATE
modul de creare a fișierelor în mod implicit. Aceasta înseamnă că fișierele nu pot fi accesate de nicio altă aplicație de pe dispozitiv. Prin urmare, este cel mai potrivit loc pentru a stoca toate datele sensibile ale aplicației dvs. în directorul intern de stocare.
Pentru a determina calea absolută a directorului de stocare intern al aplicației, este recomandat să utilizați getFilesDir ()
metodă. Odată ce știți calea sa, trimiterea de fișiere în interiorul acestuia este la fel de simplă ca și referirea fișierelor din orice alt director. De exemplu, iată cum puteți face referire la un fișier numit myfile.dat în directorul de stocare intern al aplicației:
Fișierul myFile = fișier nou (getFilesDir (), "myfile.dat");
Capacitatea internă de stocare a unui dispozitiv Android este adesea limitată. Prin urmare, uneori, este posibil să nu aveți altă opțiune decât să stocați date sensibile pe medii de stocare externe, cum ar fi o cartelă SD detașabilă.
Deoarece datele de pe mediile de stocare externe pot fi accesate direct atât de utilizatori, cât și de alte aplicații de pe dispozitiv, este important să le stocați într-un format criptat. Unul dintre algoritmii cei mai populari de criptare folosiți de dezvoltatori astăzi este AES, scurt pentru Standard de criptare avansată, cu o dimensiune cheie de 256 de biți.
Scrierea codului pentru a cripta și decripta datele aplicației utilizând javax.crypto
pachet, care este inclus în Android SDK, poate fi confuz. Prin urmare, majoritatea dezvoltatorilor preferă utilizarea bibliotecilor terțe, cum ar fi biblioteca Facebook Conceal, care de obicei sunt mult mai ușor de utilizat cu.
Programatorii experimentați care sunt noi în dezvoltarea de aplicații Android încearcă de multe ori să utilizeze socketuri, pipe-uri numite sau fișiere partajate pentru a comunica în mod asincron cu alte aplicații instalate pe un dispozitiv Android. Aceste abordări nu sunt doar grele și inelegante, ci și amenințate. O abordare mai ușoară și mai sigură a comunicării interproceselor în sistemul de operare Android este de a folosi intențiile.
Pentru a trimite date către o anumită componentă a unei aplicații, trebuie să creați o nouă instanță a unei aplicații scop
clasa și utilizarea lui setComponent ()
pentru a specifica atât numele pachetului aplicației, cât și numele componentei. Apoi puteți adăuga date la acesta utilizând putExtra ()
metodă.
De exemplu, iată cum ați putea trimite șirul Salut Lume la un Activitate
denumit MyActivity, care aparține unei aplicații al cărei nume de pachet este my.other.app:
// Creați intenția Intent intent = new Intent (); // Specificați numele componentei intent.setComponent (noul ComponentName ("my.other.app", "my.other.app.MyActivity")); // Adăugați date intent.putExtra ("DATA", "Hello World!"); // Trimiteți intenția activității startActivitate (intenție);
Pentru a trimite date la mai multe aplicații simultan, puteți trimite intenția ca o difuzare utilizând sendBroadcast ()
metodă. Cu toate acestea, în mod prestabilit, o transmisie poate fi citită de orice aplicație care are o configurație adecvată BroadcastReceiver
.
Prin urmare, dacă doriți să trimiteți informații sensibile ca o difuzare, trebuie să utilizați o permisiune personalizată al cărei protectionLevel
este setat sa semnătură
. Procedând astfel, sistemul de operare Android vă asigură că numai aplicațiile care au fost semnate utilizând cheia de semnare pot recepționa difuzarea.
Iată un fragment de cod care vă arată cum să trimiteți șirul Salut Lume ca o transmisie securizată:
// Creați intenția Intent intent = new Intent (); // adăugați date intent.putExtra ("DATA", "Hello World"); // Specificați un nume de acțiune pentru // intent-filter intent.setAction al receptorului ("my.app.receive"); // Trimiteți ca difuzare utilizând o permisiune personalizată sendBroadcast (intent, "my.custom.permission");
Rețineți că codul de mai sus funcționează conform așteptărilor numai dacă permisiunea personalizată este declarată și utilizată în fișierele manifeste ale aplicațiilor de expeditor și de receptor.
Toate comunicările dintre aplicația dvs. și serverele dvs. trebuie să fie efectuate printr-o conexiune HTTPS, de preferință utilizând HttpsURLConnection
clasă. Dacă credeți că folosiți HTTP pentru date care nu sunt confidențiale este bine, gândiți-vă din nou.
Mulți utilizatori Android se conectează în mai multe hotspoturi deschise Wi-Fi în zonele publice în fiecare zi. Unele dintre aceste hotspot-uri ar putea fi rău intenționate. Un hotspot rău intenționat poate modifica cu ușurință conținutul traficului HTTP pentru ca aplicația dvs. să se comporte într-o manieră neașteptată sau chiar mai rău, să injecteze anunțuri sau să exploateze în el.
Prin utilizarea HTTPS, atâta timp cât serverul este configurat cu un certificat emis de o autoritate de certificare de încredere, cum ar fi DigiCert sau GlobalSign, puteți fi siguri că traficul dvs. de rețea este protejat atât împotriva interceptărilor de interceptare, cât și împotriva atacurilor de tip "man-in-the-middle".
Dacă aplicația dvs. are o mulțime de coduri de rețea și vă este frică să transmiți necontenit unele date ca text clar, trebuie să luați în considerare utilizarea nogotofail, un instrument open source construit de Google pentru a găsi astfel de greșeli.
Înapoi când GCM, scurt pentru Google Cloud Messaging, nu exista, mulți dezvoltatori folosesc SMS-uri pentru a împinge datele din serverele lor în aplicațiile lor. Astăzi, această practică este în mare măsură dispărută.
Dacă sunteți unul dintre dezvoltatorii care nu au făcut încă trecerea de la SMS la GCM, trebuie să știți că protocolul SMS nu este nici criptat, nici sigur împotriva atacurilor de falsificare. Mai mult, un SMS poate fi citit de orice aplicație de pe dispozitivul utilizatorului care are READ_SMS
permisiune.
GCM este mult mai sigur și este modul preferat de a transmite mesaje către o aplicație deoarece toate comunicațiile GCM sunt criptate. Acestea sunt autentificate folosind jetoane de înregistrare periodic actualizate pe partea clientului și o cheie API unică pe partea de server. Pentru a afla mai multe despre GCM, vă puteți referi la acest tutorial despre notificările push.
Confidențialitatea utilizatorilor are o importanță majoră în aceste zile. De fapt, există legi, cum ar fi Directiva Uniunii Europene privind protecția datelor și Legea privind protecția informațiilor personale și documentația electronică a Canadei, care mandatează protecția vieții private a unui utilizator. Prin urmare, dacă nu aveți un motiv bun și o infrastructură foarte sigură pentru colectarea, stocarea și transmiterea informațiilor personale despre utilizatori, trebuie să evitați să le cereți în mod direct în aplicațiile dvs..
O abordare mai bună a autentificării utilizatorilor și a informațiilor din profilul de utilizator care caută pe Android este prin intermediul platformei Google Identity Platform. Platforma Google Identity permite utilizatorilor să se conecteze rapid la aplicația dvs. utilizând contul Google. După ce v-ați conectat cu succes pe platformă, ori de câte ori este necesar, aplicația dvs. poate căuta cu ușurință diverse detalii despre utilizator, cum ar fi numele utilizatorului, adresa de e-mail, fotografia de profil, persoanele de contact și multe altele. Alternativ, puteți utiliza servicii gratuite, cum ar fi Firebase, care vă pot gestiona autentificarea utilizatorilor.
Dacă trebuie să gestionați singur acreditările utilizatorului, este recomandat să le stocați și să le transmiteți sub formă de hashes securizat. Cea mai simplă metodă de generare a diferitelor tipuri de hashuri utilizând SDK-ul Android este utilizarea MessageDigest
clasă.
Iată un fragment mic de cod care vă arată cum să creați un hash al șirului Salut Lume utilizând funcția de ștergere SHA-256:
// Initializați MessageDigest pentru a utiliza SHA-256 MessageDigest md = MessageDigest.getInstance ("SHA-256"); // Convertiți șirul într-un octet de hash [] sha256Hash = md.digest ("Hello World" .getBytes ());
Pe Android, intrarea nevalidă a utilizatorilor nu duce, de obicei, la probleme de securitate precum depășirea tamponului. Cu toate acestea, dacă permiteți utilizatorilor să interacționeze cu o bază de date SQLite sau cu un furnizor de conținut care utilizează intern o bază de date SQLite, trebuie fie să dezinstalați în mod riguros intrarea utilizatorilor, fie să utilizați interogări parametrizate. Dacă nu faceți acest lucru, datele dvs. sunt vulnerabile la atacurile de tip SQL.
Pe o notă similară, validarea și dezinfectarea de intrare a utilizatorului este, de asemenea, foarte importantă dacă utilizați intrarea utilizatorului pentru a genera dinamic codul pentru a rula pe un motor de scripting încorporat, cum ar fi Mozilla Rhino.
Măsurile de securitate construite într-o aplicație Android pot fi compromise în mod grav dacă atacatorii pot să-și pună mâna pe codul sursă. Înainte de a vă publica aplicația, este recomandat să folosiți un instrument numit ProGuard, care este inclus în SDK-ul Android, pentru a obfusca și a minimiza codul sursă.
Android Studio include automat ProGuard în procesul de construire dacă buildType
este setat sa eliberare
. Configurația implicită ProGuard disponibilă în SDK-urile Android ProGuard-android.txt fișierul este suficient pentru majoritatea aplicațiilor. Dacă doriți să adăugați reguli personalizate la configurație, puteți face acest lucru în interiorul unui fișier numit proguard-rules.pro, care face parte din fiecare proiect Android Studio.
Sper că aveți acum o mai bună înțelegere a modului de a vă asigura securitatea aplicațiilor Android. Majoritatea celor mai bune practici pe care le-am menționat în acest articol sunt valabile numai dacă utilizați Android SDK pentru a vă dezvolta aplicațiile. Dacă utilizați în schimb Android NDK, trebuie să fiți mult mai atent, deoarece, în timp ce programați în limba C, sunteți așteptat să gestionați detaliile de nivel inferior, cum ar fi pointerii și alocarea memoriei.
Pentru a afla mai multe despre securitatea pe Android, vă puteți referi la documentele de securitate AOSP.