Table of Contents
Forstå datakryptering på iOS
iOS implementerer kryptering på flere lag for å beskytte sensitive data. På maskinvarenivå administrerer Secure Enclave krypteringsnøkler og kryptografiske operasjoner. På operativsystemnivå Databeskyttelse bruker filnivåkryptering som knytter dekrypteringsnøkler til enhetens passkode. For appspesifikke data kan utviklere utnytte rammeverk som CryptoKit, CommonCrypto og sikkerhetsrammeverket for å kryptere individuelle poster, filer eller nettverksgjengivelser.
Kryptering konverterer klartekst til krypteringstekst ved hjelp av en algoritme og en nøkkel. Uten riktig nøkkel, dataene forblir uleselig. Apples iOS Data Protection API krypterer automatisk filer i hvile, men utviklere trenger eksplisitt kryptering for data lagret utenfor det beskyttede filsystemet ⁇ som i kjernedata, brukerstandarder eller tilpassede buffere.
Nøkkelen takeaway: encrypt sensitive data når den befinner seg på enheten, selv om iOS-kryptering er aktivert som standard. Dette sikrer beskyttelse mot tilgang til fysisk enhet, rettsmedisinsk utvinning eller ondsinnede apper som kjører i samme sandkasse.
iOS-krypteringsrammer og API-er
Apple tilbyr flere kryptografiske biblioteker. Å velge den riktige avhenger av utplasseringsmålet og nivået på kontrollen som kreves.
CryptoKit ⁇ Modern Swift API
Introdusert i iOS 13, CryptoKit tilbyr et Swift-nativt grensesnitt for symmetrisk og asymmetrisk kryptografi, hashing og nøkkelavtale. Den bruker AES-GCM for autentisert kryptering, som beskytter både konfidensialitet og integritet. Nedenfor er et typisk krypterings- og dekrypteringsmønster:
import CryptoKit
func encryptSensitiveData(_ plaintext: String, using key: SymmetricKey) throws -> Data {
let inputData = Data(plaintext.utf8)
let sealedBox = try AES.GCM.seal(inputData, using: key)
return sealedBox.combined
}
func decryptSensitiveData(_ encryptedData: Data, using key: SymmetricKey) throws -> String {
let sealedBox = try AES.GCM.SealedBox(combined: encryptedData)
let decryptedData = try AES.GCM.open(sealedBox, using: key)
return String(decoding: decryptedData, as: UTF8.self)
}
Lagre alltid i Keychain, ikke i UserDefaults eller en vanlig fil. Bruk med for å knytte nøkkelen til enheten og brukerens tilstedeværelse.
C-basert fleksibilitet
For apper som støtter eldre iOS-versjoner eller krever tilpassede blokkeringskoder (f.eks. CBC med HMAC), gir CommonCrypto funksjoner på lavt nivå C. Den støtter AES, DES, 3DES og ulike hashing algoritmer. Eksempel på AES-CBC kryptering:
#include <CommonCrypto/CommonCryptor.h>
- (NSData *)aes256Encrypt:(NSData *)plaintext withKey:(NSData *)key iv:(NSData *)iv {
size_t outLength;
NSMutableData *ciphertext = [NSMutableData dataWithLength:plaintext.length + kCCBlockSizeAES128];
CCCryptorStatus status = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
key.bytes, key.length, iv.bytes,
plaintext.bytes, plaintext.length,
ciphertext.mutableBytes, ciphertext.length,
&outLength);
if (status == kCCSuccess) {
ciphertext.length = outLength;
return ciphertext;
}
return nil;
}
CommonCrypto krever manuell styring av initialiseringsvektorer (IV) og autentiseringstagger. For autentisert kryptering, par AES-CBC med en separat HMAC, eller bytte til AES-GCM via CryptoKit når det er mulig.
Sikkerhetsramme og nøkkelring
Sikkerhetsrammeverket gir Keychain-tjenester for sikker lagring av nøkler, sertifikater og passord. Bruk til å lagre nøkler med strenge tilgangskontroller (f.eks. krever brukerens tilstedeværelse via biometriske midler). Secure Enclave kan generere og lagre private nøkler for ECC-operasjoner, noe som sikrer at nøkkelen aldri forlater maskinvaren.
Kryptering for forskjellige datatyper
Ikke alle data trenger samme krypteringsstrategi. Tailor tilnærmingen til hvordan og hvor dataene brukes.
Kryptere brukerstandard og kjernedata
Brukerstandarder og kjernedatalagringer er enkle SQLite-filer med mindre de er krypterte. For kjernedata, aktiver NSFileProtectionType attributt på lagerfilen. For finere granularitet, kryptere individuelle attributter eller hele objekter før du lagrer:
- Bruk kjernedata transformerbare attributter med en egendefinert verditransformator som krypterer/dekrypterer på les/skrive.
- Serialiser hele det administrerte objektet som JSON, kryptere det og lagre krypteringsteksten i en binær attributt.
- For brukerstandarder lagrer du aldri rå sensitive strenger; krypterer hver verdi og lagrer krypterte data.
Eksempel på lagring av krypterte data i brukerstandarder:
let key = SymmetricKey(size: .bits256)
let data = "user_ssn".data(using: .utf8)!
let sealedBox = try AES.GCM.seal(data, using: key)
UserDefaults.standard.set(sealedBox.combined, forKey: "encrypted_ssn")
UserDefaults.standard.synchronize()
Kryptere filer med filbeskyttelse
iOS tilbyr filnivå beskyttelse klasser: , og . Sett disse attributtene når du oppretter eller beveger filer:
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)
Kombiner filbeskyttelse med eksplisitt kryptering hvis dataene må forbli beskyttet selv når enheten er låst opp. For eksempel kryptere filen med en nøkkel lagret i Keychain og kun tilgjengelig etter autentisering.
Kryptere nettverksdata (transportlagsikkerhet)
App Transport Security (ATS) håndhever HTTPS som standard. For egendefinerte TCP-forbindelser, bruk med TLS eller implementer SSL-pinning for å hindre man-i-midle-angrep. Krypter nyttelasten på applikasjonslaget for ytterligere forsvars-i-dybde: Selv om TLS er kompromittert, forblir dataene beskyttet.
Nøkkelledelse beste praksis
Kryptering er bare så sterk som nøkkelhåndteringen. Følg disse retningslinjene for å opprettholde sikkerheten:
- Opprett nøkler ved hjelp av en kryptografisk sikker tilfeldig tallgenerator] ⁇ Bruk eller .
- Store nøkler utelukkende i Keychain med passende tilgjengelighetsattributter: hindrer sikkerhetskopiering og binder nøkkelen til enheten.
- Bruk biometrisk eller passkode-autentisering før du henter nøkkelen ⁇ med tvinger brukerverifisering.
- Roter tastene på en tidsplan eller etter en sikkerhetshendelse] ⁇ Re-encrypt data med nye nøkler og sikkert slette gamle nøkler.
- Ikke hardcode-tastene i kildekode eller konfigurasjonsfiler. Avledede nøkler fra brukerpassord ved hjelp av en langsom nøkkel-avledefunksjon (PBKDF2 eller scrypt) når det er nødvendig.
- Behold Secure Enclave for asymmetrisk nøkkelgenerasjon ⁇ private nøkler kan ikke eksporteres, hindre eksfiltrasjon.
For apper som håndterer svært sensitive data, bør du vurdere å bruke en hardware sikkerhetsmodul (HSM) via nettverkstjenester, men det introduserer latens og krever Internett-tilkobling.
Nøkkelrotasjon og re-kryptering
Når en nøkkel kompromitteres eller etter en definert periode (f.eks. hver 90-dag), roterer nøkkelen. Dette innebærer å dekryptere alle data med den gamle nøkkelen, generere en ny nøkkel og kryptere. For store datasett implementere et versjonsløst nøkkelskjema:
- Lagre en nøkkelidentifikator (f.eks. UUID) sammen med hver kryptert oppføring.
- Hold en kartlegging av identifikatorer til faktiske nøkler i Keychain (kryptert i hvile).
- Under rotasjon, legg til en ny oppføring uten umiddelbart å kryptere alle data.
Overholdelse og regulering
Mange forskrifter mandat kryptering for sensitive data. GDPR krever passende tekniske tiltak, og kryptering er en anerkjent pseudonymiseringsteknikk. HIPAA mandater kryptering av ePHI i hvile og transitt. PCI DSS krever kryptering av kortholderdata. I iOS, i henhold til Apples retningslinjer for databeskyttelse kombinert med bruks-lag kryptering oppfyller de fleste overholdelseskrav. Dokumentér krypteringen din, livssykluspolitikkene og revisjonssporene for regulatorvurdering.
Referer til offisiell Apple-dokumentasjon for de nyeste anbefalingene: CryptoKit Utviklerguide], Keychain Services], og Beskytter brukerens personvern. For bransjens veiledning, se ]OWASP Mobile Security Testing Guide og NIST SP 800-175B ⁇ Cryptografiske standarder].
Testing og validering
Etter å ha implementert kryptering, verifiser det fungerer riktig:
- Skriv enhetstester som krypterer og dekrypterer kjente klartekster og hevder utganger.
- Test kant tilfeller: tomme data, svært store nyttelaster og ødelagte krypteringstekster.
- Utfør sikkerhetstesting ved hjelp av en fengselsbrekket enhet for å simulere angrepsscenarier ⁇ verifisere at nøkler forblir utilgjengelige uten autentisering.
- Bruk statisk analyseverktøy for å sikre ingen hardkodede nøkler eller svake algoritmer.
- Gjennomgang logger ⁇ aldri logger klartekst sensitive data eller krypteringsnøkler.
Konklusjon
Implementering av datakryptering for sensitive iOS datalagring er en flerlagsprosess. Ved å kombinere iOS-filbeskyttelse, program-lag kryptering med CryptoKit eller CommonCrypto, og streng nøkkelhåndtering via Keychain og Secure Enclave, kan utviklere i betydelig grad redusere risikoen for dataeksponering. Overholdelse av forskrifter som GDPR og HIPAAA krever dokumentert, revisjonsbar krypteringspraksis. Regelmessig testing og nøkkelrotasjon sikrer langsiktig sikkerhet. Å investere i en robust krypteringsarkitektur beskytter ikke bare brukerdata, men bygger også tillit og oppfyller regulatoriske forventninger.