Mobilna bezbednost je skup mera za zaštitu aplikacije, korisničkih podataka i serverske infrastrukture od napada i curenja podataka. По данным OWASP Mobile Top 10 (2024), nesigurno čuvanje podataka ostaje najčešća ranjivost u mobilnim aplikacijama. U ovom članku ćemo razmotriti glavne pretnje, metode enkripcije, bezbedno skladištenje, autentifikaciju i zaštitu koda — sve što treba da zna početnik programer.
Glavno
OWASP (Open Web Application Security Project) — некоммерческая организация, публикующая рейтинг самых опасных уязвимостей мобильной безопасности. OWASP Mobile Top 10 je lista koja pomaže programerima da shvate na šta prvo treba obratiti pažnju. U verziji iz 2024. godine vode problemi vezani za nesigurno čuvanje podataka, slabu autentifikaciju i nesigurnu mrežnu komunikaciju.
M1: Nesigurno čuvanje podataka — najčešći problem: lozinke, tokeni i lični podaci ostaju u SharedPreferences, NSUserDefaults ili lokalnim fajlovima bez enkripcije. M2: Slaba autentifikacija — odsustvo provere na strani servera, slabe lozinke. M3: Nesigurna mrežna komunikacija — odsustvo HTTPS ili nepravilna provera SSL sertifikata. M4 i M5 su povezane sa kriptografijom i nepravilnom upotrebom API-ja.
M6: Nesigurna autorizacija — korisnik može dobiti pristup podacima drugog korisnika putem zamene ID-ja u zahtevu. M7: Injekcije koda (SQL Injection, XSS). M8: Manipulacije aplikacijom — repacking, zamena koda. M9 i M10 — curenje podataka kroz treće biblioteke i obrnuti inženjering. Za svaku od ovih pretnji postoje proverene protivmere, i u IT Sectr ih primenjujemo u svim projektima od 2017. godine.
MITM napad (napad „čovek u sredini“) se dešava kada napadač presreće saobraćaj između aplikacije i servera. Ovo je moguće putem zamene DNS-a, ARP spoofinga ili povezivanja na nezaštićenu Wi-Fi mrežu. Za zaštitu se koriste SSL/TLS sertifikati i Certificate Pinning.
Certificate Pinning — mehanizam kojim aplikacija proverava da li sertifikat servera odgovara unapred sačuvanom u kodu aplikacije. Čak i ako napadač zameni sertifikat putem proxy-ja (npr. Burp Suite), aplikacija će odbaciti vezu. Pinning je dva tipa: pinning po javnom ključu (Public Key Pinning) i po hešu sertifikata (Certificate Hash Pinning).
AES (Advanced Encryption Standard) — симметричный алгоритм шифрования, основа безопасности данных на устройстве. AES koristi isti ključ za šifrovanje i dešifrovanje podataka. AES podržava ključeve dužine 128, 192 ili 256 bita. U mobilnom razvoju AES-256 se koristi za enkripciju podataka na uređaju: fajlova, keša, zapisa u lokalnoj bazi podataka.
AES režimi: GCM (preporučen) — obezbeđuje autentifikaciju podataka, CBC — osnovni režim sa lancem blokova, ECB — nesiguran, nemojte ga koristiti. Za iOS AES je dostupan kroz CommonCrypto (CCOptions), za Android — kroz Cipher u Java Cryptography Architecture (JCA). Važno: ključ za enkripciju nikada ne sme biti sačuvan u kodu aplikacije — koristite Keychain/Keystore.
Asimetrična enkripcija: RSA — koristi par ključeva (javni i privatni). RSA se koristi za enkripciju malih količina podataka — obično za razmenu simetričnog ključa između klijenta i servera. Dužina RSA ključa je minimum 2048 bita (preporučuje se 4096). U iOS RSA je dostupan kroz Security Framework (SecKeyCreateRandomKey), u Android — kroz KeyPairGenerator u Android Keystore.
Heširanje (SHA-256, SHA-3) — nepovratna transformacija podataka u string fiksne dužine. Heševi se koriste za proveru integriteta podataka i čuvanje lozinki. Za lozinke obavezno koristite bcrypt, scrypt ili Argon2 — običan SHA-256 je ranjiv na napade dužinim tabelama. SSL/TLS — protokol za enkripciju mrežnog saobraćaja između klijenta i servera. Savremeni standard je TLS 1.3, koji obezbeđuje Perfect Forward Secrecy (PFS).
TLS 1.3 je brži od prethodnika: handshake traje jedan round-trip umesto dva. Na Android-u minimalna TLS verzija se podešava kroz SSLSocket, na iOS-u — kroz ATS (App Transport Security), koji podrazumevano zahteva TLS 1.2 ili viši. Isključivanje ATS-a za iOS aplikaciju je dozvoljeno samo za konkretne domene sa obrazloženjem.
Keychain (Связка ключей) — защищённое хранилище в iOS / macOS для паролей, ключей шифрования, сертификатов и токенов. Podaci u Keychain se šifruju hardverskim ključem, jedinstvenim za svaki uređaj. Pristup Keychain-u se kontroliše kroz Security Framework (SecItemAdd, SecItemCopyMatching). Keychain se automatski zaključava kada se uređaj zaključa i šifruje se pomoću Secure Enclave.
Android Keystore — системное хранилище криптографических ключей, изолированное от приложения. Od Android 6.0 (API 23), Keystore koristi hardversku podršku (TEE — Trusted Execution Environment) na uređajima sa bezbednosnim čipom. Ključevi u Keystore nikada ne napuštaju zaštićeno područje — aplikacija dobija samo handle za operacije šifrovanja i potpisivanja.
| Parametar | iOS Keychain | Android Keystore |
|---|---|---|
| Tip čuvanih podataka | Lozinke, tokeni, ključevi, sertifikati | Kriptografski ključevi |
| Hardverska podrška | Secure Enclave (svi iPhone sa A7+) | TEE (Android 6+, zavisi od čipa) |
| Шифрование | AES-256 hardverska | AES/GCM sa hardverskim ključem |
| Биометрия | Face ID / Touch ID za pristup | BiometricPrompt za pristup |
| iCloud / bekap | Sinhronizacija kroz iCloud Keychain | Ne sinhronizuje se sa oblakom |
| Performanse | Sporije (hardverska enkripcija) | Brže (TEE) |
SharedPreferences и NSUserDefaults nisu namenjeni za čuvanje poverljivih podataka — oni čuvaju informacije u otvorenom obliku. Za zaštitu podataka koristite EncryptedSharedPreferences (Android) ili šifrujte podatke pre čuvanja u UserDefaults (iOS). U IT Sectr uvek koristimo Keychain i Keystore za tokene pristupa i lozinke.
OAuth 2.0 — protokol delegirane autorizacije koji obezbeđuje siguran pristup resursima korisnika bez prenošenja lozinke. U mobilnim aplikacijama najčešće se koristi Authorization Code Flow sa PKCE (Proof Key for Code Exchange). PKCE sprečava presretanje autorizacionog koda — obavezni zahtev za mobilne aplikacije.
OpenID Connect (OIDC) je nadogradnja na OAuth 2.0 za autentifikaciju korisnika. OIDC dodaje ID Token u JWT formatu koji sadrži informacije o korisniku (ime, email, id). OAuth 2.0 + OIDC tok uključuje: preusmeravanje korisnika na stranicu za prijavu, dobijanje autorizacionog koda, razmenu koda za tokene (access + refresh + id), korišćenje access tokena za API zahteve.
JWT (JSON Web Token) — компактный URL-безопасный формат токена, который содержит claims в формате JSON. JWT se sastoji od tri dela: header (tip i algoritam potpisa), payload (podaci) i signature (potpis). Access Token je kratkotrajni token (15–60 minuta) za pristup API-ju. Refresh Token je dugotrajni (dani/nedelje) za dobijanje novog access tokena bez ponovne prijave.
Session Token — традиционный подход, где сервер хранит сессию в БД или Redis, а клиент получает случайный идентификатор. U mobilnom razvoju JWT je poželjniji: ne zahteva serversko čuvanje sesija, sadrži sve informacije unutar sebe i lako se proverava. Međutim, JWT se ne može momentalno opozvati — ovo je kompromis koji se rešava kratkim vekom trajanja access tokena i korišćenjem refresh tokena.
Face ID и Touch ID на iOS, Fingerprint Auth на Android — биометрические методы аутентификации, использующие уникальные физические характеристики пользователя. U iOS biometrija radi kroz LocalAuthentication (LAContext), u Android — kroz BiometricPrompt (Android 9+) ili FingerprintManager (zastareo). Biometrija se koristi za otključavanje aplikacije, potvrđivanje plaćanja i pristup zaštićenim podacima.
Važne nijanse: biometrija je zgodan UX, ali ne zamenjuje serversku autentifikaciju. Nakon uspešne biometrijske verifikacije aplikacija treba da dobije access token od servera. Na Android-u obavezno proverite da uređaj koristi Class 3 (Strong) biometriju, a ne samo prepoznavanje lica putem kamere (Class 1).
ProGuard — инструмент обфускации, сжатия и оптимизации Java-байткода для Android, повышающий безопасность кода от обратной разработки. R8 je njegov naslednik, ugrađen u Gradle od Android Studio 3.4. R8 obavlja četiri zadatka: kompresiju (uklanja neiskorišćene klase i metode), optimizaciju (inline metode, pojednostavljuje kod), obfuskaciju (preimenuje klase i metode u kratka imena) i pre-verifikaciju (provera bajtkoda).
DexGuard — коммерческая версия ProGuard с расширенной защитой: шифрование строк, обфускация ресурсов, защита от репаккинга, контроль целостности APK. Za većinu projekata dovoljan je R8, ali za finansijske i bankarske aplikacije DexGuard obezbeđuje dodatni nivo zaštite. Включается R8 через build.gradle: minifyEnabled = true и proguardFiles.
Root Detection (Android) и Jailbreak Detection (iOS) — механизмы, которые проверяют, получены ли на устройстве привилегии суперпользователя. Na hakovanim uređajima može se čitati memorija procesa, presretati saobraćaj i zamenjivati kod. Za proveru na Android-u koristi se provera prisustva SU-binarnog fajla, testnih ključeva potpisa i nestandardnih build flagova.
RASP (Runtime Application Self-Protection) — технология, которая защищает приложение во время выполнения. RASP otkriva pokušaje debugovanja, repackinga, injektiranja koda i prekida rad aplikacije kada otkrije pretnje. Primeri RASP rešenja: Dexter, Guardsquare, Promon. RASP radi u toku izvršenja i reaguje na anomalije — za razliku od statičke obfuskacije koja štiti kod pre pokretanja.
Reverse Engineering — процесс восстановления исходного кода из скомпилированного приложения. Alati: JADX (dekompajler APK-a), Ghidra, IDA Pro, Hopper. Zaštita od Reverse Engineering-a je kombinacija obfuskacije, enkripcije stringova, provere integriteta i Root Detection-a. Potpuna zaštita ne postoji — zadatak je da obrnuti inženjering bude dovoljno skup za napadača.
Često postavljana pitanja
Начните с OWASP Mobile Top 10 — это дорожная карта самых частых уязвимостей. Zatim proučite HTTPS i SSL sertifikate, podesite Certificate Pinning i pređite na bezbedno skladištenje kroz Keychain / Keystore.
AES (симметричное) — один ключ для шифрования и расшифровки, быстрый, подходит для больших объёмов данных. RSA (asimetrična) — par ključeva (javni i privatni), sporiji, koristi se za razmenu simetričnog ključa.
Шифровать нужно только конфиденциальные данные: пароли, токены, персональные данные пользователя, платёжную информацию. Slike, tekstovi i podešavanja interfejsa ne zahtevaju šifrovanje — to bi povećalo veličinu i usporilo aplikaciju.
Refresh Token — долгоживущий токен, который позволяет получить новый Access Token без повторного ввода пароля. Ovo povećava bezbednost — Access Token živi 15–60 minuta i čak i ako procure, napadač neće moći dugo da ga koristi.
Да, R8 обязательно включать для release-сборок Android. To nije samo zaštita od Reverse Engineering-a, već i smanjenje veličine APK-a i optimizacija performansi. Bez R8 vaš kod se može dekompajlirati u čitljiv oblik jednom JADX komandom.
Zaključak
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.