Bezpečnostní zásady ve vývoji mobilních aplikací: ochrana dat a uživatelů

Bezpečnost jako prvořadá třída požadavků

Vývoj bezpečných mobilních aplikací pro Android a iOS vyžaduje systematický přístup napříč celým životním cyklem: od návrhu přes implementaci, testování, nasazení až po provoz a reakci na incidenty. Bezpečnost není pouze otázkou kryptografie nebo „pinningu certifikátu“, ale zahrnuje správnou architekturu, ochranu dat v klidu i během přenosu, robustní autentizaci, omezení oprávnění, bezpečnou integraci SDK třetích stran, obranu proti reverzní analýze i důsledné logování a monitoring. Tento článek shrnuje zásady, vzory a anti-vzory v souladu s OWASP MASVS/MSTG a platformními doporučeními (Android/Google, Apple).

Model hrozeb a rizikově orientovaný návrh

  • Aktiva: PII, přístupové tokeny, kryptografické klíče, obchodní logika, interní API.
  • Protivníci: oportunisté (malware, botnety), motivovaní útočníci (podvody), interní hrozby, ztráta nebo krádež zařízení.
  • Útokové plochy: síť, úložiště, inter-procesová komunikace (IPC/Intents/URL schemata), WebView, deep links, push notifikace, integrace SDK.
  • Kontext: hrozby na rootnutých/jailbreaknutých zařízeních, MDM/enterprise režimy, regulace (GDPR/PSD2/HIPAA).

Architektonické principy: „minimální důvěra“ a „odděl a zjednoduš“

  • Zero Trust mezi klientem a backendem; server vždy ověřuje a autorizuje.
  • Oddělení domén: autentizace/autorizace, datová vrstva, prezentace a integrace SDK izolovat a modulárně testovat.
  • Minimální oprávnění: žádat pouze nezbytná platformní permissions; průběžně auditovat.
  • Bezstavové API: přístupy založené na tokenech (OAuth 2.1/OIDC), krátká platnost, možnost revokace.

Autentizace, autorizace a správa relací

  • OAuth 2.1 / OIDC: pro veřejné mobilní klienty Authorization Code with PKCE; neukládat client secret přímo v aplikaci.
  • Tokeny: krátká životnost (access token), refresh token chránit na zařízení (Keychain/Keystore); při podezření na kompromitaci tokeny revokovat.
  • Biometrie: použít systémová API (iOS LocalAuthentication, Android BiometricPrompt) pro strong faktor a odemykání lokálně šifrovaných tajemství.
  • MFA a rizikově řízená autentizace: v závislosti na riziku transakce (např. PSD2 SCA), device binding s atestací (SafetyNet/Play Integrity, DeviceCheck).

Ochrana dat v klidu: bezpečné úložiště a šifrování

  • iOS: Keychain (klastry kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly pro vyšší citlivost), Data Protection (NSFileProtection), Complete Until First User Authentication.
  • Android: Keystore (hardware-backed, AES/GCM, RSA/ECDSA pro obálkové šifrování), EncryptedSharedPreferences, EncryptedFile, oddělení klíčů per uživatel a zařízení.
  • Lokální databáze: používat šifrované varianty (SQLCipher/Room s SupportFactory), rotace klíčů, salting a KDF (Argon2id/scrypt) pro derivaci klíčů.
  • Citlivý obsah v uživatelském rozhraní: zakázat screenshots na Androidu (FLAG_SECURE), chránit náhledy v iOS (prázdný snapshot při přechodu do pozadí).

Ochrana dat během přenosu: TLS a pinning

  • TLS 1.2+ s bezpečnými sada, HSTS na backendu, zákaz cleartext komunikace.
  • Android: networkSecurityConfig s definicí trust-anchors a pinningem (SPKI); zakázat cleartextTrafficPermitted.
  • iOS: ATS (App Transport Security) s vynucením TLS; pinning přes URLSessionDelegate.
  • Revokace a rotace certifikátů: pinovat public key (SPKI) na CA/intermediární/backup klíč pro hladkou výměnu certifikátů.

Ukázky konfigurací (Android/iOS)

<!-- AndroidManifest.xml: zakázání cleartextu -->
<application android:usesCleartextTraffic="false" android:networkSecurityConfig="@xml/network_security_config">...</application>
<!-- res/xml/network_security_config.xml: SPKI pinning -->
<network-security-config>
  <domain-config cleartextTrafficPermitted="false">
    <domain includeSubdomains="true">api.example.com</domain>
    <pin-set expiration="2027-12-31">
      <pin digest="SHA-256">3lK5k8...base64SPKI...=</pin>
      <pin digest="SHA-256">backupKeyBase64==</pin>
    </pin-set>
  </domain-config>
</network-security-config>
// OkHttp pinning (doplňte SPKI hash)
val client = OkHttpClient.Builder()
    .certificatePinner(
        CertificatePinner.Builder()
            .add("api.example.com", "sha256/3lK5k8...=")
            .add("api.example.com", "sha256/backupKeyBase64==")
            .build()
    ).build()
// iOS: URLSessionDelegate pro SPKI pinning
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    guard let serverTrust = challenge.protectionSpace.serverTrust,
          SecTrustEvaluateWithError(serverTrust, nil),
          let cert = SecTrustGetCertificateAtIndex(serverTrust, 0) else {
        return completionHandler(.cancelAuthenticationChallenge, nil)
    }
    let key = SecCertificateCopyKey(cert)!
    let spki = SecKeyCopyExternalRepresentation(key, nil)! as Data
    let hash = sha256(spki) // porovnat s whitelistem
    if allowedHashes.contains(hash) {
        completionHandler(.useCredential, URLCredential(trust: serverTrust))
    } else {
        completionHandler(.cancelAuthenticationChallenge, nil)
    }
}

Bezpečné zacházení s oprávněními a ochranou soukromí

  • Runtime oprávnění žádat kontextově; vysvětlit uživateli přínos; respektovat odvolání souhlasu.
  • Citlivá data: lokalizace, kontakty, kamera, mikrofon – vyžadovat pouze v případě nezbytnosti; v iOS popsat NSPrivacyUsageDescription v Info.plist.
  • Telemetrie a SDK: minimalizovat identifikátory, respektovat ATT (iOS) a zásady souhlasu; verzovat seznam SDK a přehled přenášených dat.

WebView a komponenty prohlížeče

  • Android: povolit JavaScript jen pokud je nezbytný; zakázat přístupy file://, použít setAllowFileAccess(false), setAllowUniversalAccessFromFileURLs(false), addJavascriptInterface používat pouze s anotací @JavascriptInterface a nikdy pro citlivé funkce.
  • iOS: WKWebView s WKContentRuleList, zakázat inline skripty pomocí CSP, omezit message handlers a validovat URL.
  • Obsah: striktní CSP, izolace domén, same-origin policy, žádné přihlašovací formuláře mimo TLS kontext.

Deep Links, Universal Links a IPC

  • Universal/App Links: preferovat doménově ověřené linky (apple-app-site-association / assetlinks.json).
  • URL schémata: vyhnout se kolizím; vždy validovat a normalizovat vstupy – chránit před otevřením neautorizovaných obrazovek.
  • Android IPC: komponenty označené jako exported pouze pokud nezbytné; chránit Activity/Service/BroadcastReceiver pomocí permission; PendingIntent vytvářet s FLAG_IMMUTABLE.

Bezpečné kódování a ochrana proti reverzní analýze

  • Žádná tajemství v kódu: API klíče, tokeny a URL neukládat v prostém kódu; používat dynamickou distribuci a obálkové šifrování.
  • Obfuskace: R8/Proguard (Android), LLVM obfuskace (omezeně); kontrolovat mapování a build chain.
  • Detekce root/jailbreak: pouze jako signál pro zvýšení ostražitosti/rizik, ne jako jediná obrana; vyvarovat se snadno obejitelných kontrol.
  • Hooking/Debugging: detekovat ladicí příznaky v rizikových tocích; citlivé operace vykonávat pokud možno na serveru.

Kryptografie: správné algoritmy a správa klíčů

  • Algoritmy: AES-GCM/ChaCha20-Poly1305 pro symetrickou kryptografii; ECDH/ECDSA (P-256/Ed25519) pro asymetrickou; PBKDF – Argon2id.
  • Náhodnost: SecRandomCopyBytes (iOS), SecureRandom (Android).
  • Rotace klíčů: verzování a migrační rutina; nikdy nerecyklovat IV/nonce.

Logování, audit a detekce anomálií

  • Žádné PII/tokeny v logu; používat korelační ID a bezpečné zarovnání na serveru.
  • Crash reporty: symbolikace mimo zařízení, minimalizovat diagnostická data; u citlivých aplikací přenášet pouze se souhlasem uživatele.
  • Runtime signály: chybná kontrola pinningu, nadměrné 401/403 odpovědi, podezřelé device signály – zasílat do bezpečnostního monitoringu.

Bezpečnost buildů, CI/CD a supply chain

  • Reproducible builds, podepisování artefaktů (Android App Signing, iOS code signing), chránit certifikáty a klíče v HSM/Cloud KMS.
  • SCA: skenování závislostí (SBOM, CVE), povinné aktualizace SDK; zákaz neznámých repozitářů.
  • Distribuce: ochrana proti sideloadingu (Android: Play Integrity), iOS TestFlight/MDM pro enterprise; řízení kanálů (alpha/beta).

Testování: od statické analýzy po penetrační test

  • Static Analysis (SAST): SwiftLint/Ktlint/Detekt + bezpečnostní pravidla; kontrola hard-coded tajemství.
  • DAST/MOTAS: testy API (OWASP ASVS), mobilní dynamické testy (OWASP MSTG); instrumentace pouze v izolovaných prostředích.
  • Kontrolní seznam MASVS: pokrýt M1–M9 (architektura, úložiště, kryptografie, autentizace atd.).

Bezpečnost notifikací, widgetů a rozšíření

  • Notifikace: neposílat tajemství do textu notifikace; u citlivých aplikací použít silent push s lokálním renderováním po odemknutí zařízení.
  • iOS Extensions/Android Widgets: izolovat data; sdílení přes App Groups (iOS) jen pro nezbytné položky, šifrované v úložišti.

Komunikace v blízkém poli (BLE/NFC)

  • BLE: vždy používat zabezpečené párování (LE Secure Connections); citlivá data šifrovat na aplikační úrovni.
  • NFC: validovat NDEF payload; omezit akce spouštěné NFC tagem.

Tabulka: mapování klíčových kontrol podle platforem

Oblast Android iOS
Úložiště tajemství Keystore (hardware-backed), EncryptedSharedPreferences Keychain (ACL, Access Groups)
Transportní bezpečnost Network Security Config, pinning (SPKI) ATS, URLSessionDelegate pinning
Oprávnění Runtime permissions, minimální exported Info.plist usage strings, entitlements
Biometrie BiometricPrompt + Keystore LocalAuthentication + Keychain
Hardening WebView Nastavení WebView, CSP, zákaz přístupu k souborům WKWebView + CSP + content rules

Checklist pro bezpečný mobilní vývoj

  • PKCE + krátké tokeny, refresh v Keychain/Keystore; žádná tajemství v kódu.
  • TLS 1.2+, SPKI pinning s rotací; zákaz cleartextu a slabých šifer.
  • Šifrované úložiště (DB/soubory), ochrana proti screenshotům a background snapshotům.
  • Minimalistická oprávnění; audit exported komponent a URL schémat.
  • WebView s CSP, bez file://; bezpečné rozhraní mezi aplikací a JavaScriptem.
  • SCA + SBOM, zákaz neprověřených SDK; telemetrie v souladu s regulacemi.
  • Obfuskace a detekce kompromit