Table of Contents
Înțelegerea criptării datelor pe iOS
iOS implementează criptarea la mai multe straturi pentru a proteja datele sensibile. La nivel hardware, Enclava Secure gestionează tastele de criptare și operațiunile de recriptare. La nivelul sistemului de operare, Protecția datelor utilizează criptarea la nivel de fișier care leagă tastele de decriptare de dispozitivul . Pentru date specifice aplicației, dezvoltatorii pot pârghii cadre precum CryptoKit, CommonCrypto, și cadrul de securitate pentru criptarea înregistrărilor individuale, fișierelor, sau a încărcăturilor utile de rețea.
Criptarea convertește text simplu în cifru folosind un algoritm și o cheie. Fără cheia corectă, datele rămân neachitate. Apple
Cheia de acces: criptează datele sensibile ori de câte ori se află pe dispozitiv, chiar dacă criptarea iOS este activată implicit. Aceasta asigură protecția împotriva accesului la dispozitive fizice, a extracției medico-legale sau a aplicațiilor rău intenționate care rulează în aceeași cutie de nisip.
iOS Cadrul de criptare și API
Apple oferă mai multe biblioteci semiconductoare. Alegerea dreapta depinde de obiectivul de implementare și nivelul de control necesar.
CryptoKit
Introdus în iOS 13, CryptoKit oferă o interfață Swift-nativ pentru criptografie simetrică și asimetrică, hashing și acordul cheie. Folosește ]AES-GCM pentru criptare autentificată, care protejează atât confidențialitatea, cât și integritatea. Mai jos este un model tipic de criptare și decriptare:
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)
}
Păstrați întotdeauna în Keychain, nu în UserDefault sau într-un fișier simplu. Utilizați cu pentru a lega cheia de dispozitiv și prezența utilizatorului.
ComunCrypto
Pentru aplicații care susțin versiuni mai vechi iOS sau care necesită moduri personalizate de codare bloc (de exemplu, CBC cu HMAC), CommonCrypto oferă funcții C de nivel scăzut. Acesta susține AES, DES, 3DES, și algoritmi de hashing diverse. Exemplu de criptare AES-CBC:
#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 necesită gestionarea manuală a vectorilor de inițializare (IV) și a etichetelor de autentificare. Pentru criptare autentificată, pereche AES-CBC cu un HMAC separat, sau comutați la AES-GCM prin CryptoKit, atunci când este posibil.
Cadrul de securitate și cheia
Cadrul de securitate oferă servicii Keychain pentru stocarea securizată a cheilor, certificatelor și parolelor. Utilizați pentru a stoca chei cu controale stricte de acces (de exemplu, necesită prezența utilizatorilor prin intermediul biometricii). Enclava securizată poate genera și stoca chei private pentru operațiunile ECC, asigurând cheia nu părăsește niciodată hardware-ul.
Implementarea criptării pentru diferite tipuri de date
Nu toate datele au nevoie de aceeași strategie de criptare. Abordează abordarea modului și a locului în care sunt utilizate datele.
Criptarea implicitelor utilizatorului și a datelor de bază
Pentru datele de bază, se activează atributul NSFileProtectionType] pe fișierul magazinului. Pentru granularitate mai fină, criptarea atributelor individuale sau a obiectelor întregi înainte de a salva:
- Utilizați date de bază transformable atribute cu un transformator de valoare personalizat care criptează/decriptează pe citire/scriere.
- Searalize întregul obiect gestionat ca JSON, criptați-l, și stoca cifrul într-un atribut binar.
- Pentru UserDefaults, nu stoca siruri de caractere brute sensibile; criptează fiecare valoare și stochează datele criptate.
Exemplu de stocare a datelor criptate în Defaulturi utilizator:
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()
Criptarea fișierelor cu protecția fișierelor
iOS oferă clase de protecție la nivel de fișier: , și . Setați aceste atribute atunci când creați sau mutați fișiere:
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)
Combină protecția fișierului cu criptarea explicită dacă datele trebuie să rămână protejate chiar și atunci când dispozitivul este deblocat. De exemplu, criptează fișierul cu o cheie stocată în Keychain și accesibilă numai după autentificare.
Criptarea datelor rețelei (Securitatea straturilor de transport)
App Transport Security (ATS) aplică HTTPS în mod implicit. Pentru conexiunile TCP personalizate, utilizați cu TLS sau implementați PIN-ul SSL pentru a preveni atacurile om-in-the-middle. Criptați sarcina utilă la stratul de aplicare pentru apărare suplimentară-în-aprofund: chiar dacă TLS este compromis, datele rămân protejate.
Cele mai bune practici de management cheie
Criptarea este la fel de puternică ca managementul cheie. Urmați aceste orientări pentru a menține securitatea:
- Tastele de generare care utilizează un generator de numere aleatorii securizate din punct de vedere al biometric
- Tastele de la stoarce exclusiv în breloc cu atribute de accesibilitate adecvate: previne backup-ul și leagă cheia de dispozitiv.
- Folosiți autentificarea biometrică sau parola înainte de a recupera cheia
- Rotați tastele pe un program sau după un eveniment de securitate
- Nu hardcode taste în codul sursă sau fișiere de configurare. Cheile de deviere de la parolele utilizatorului folosind o funcție de derivare lentă a cheii (PBKDF2 sau criptă) atunci când este necesar.
- Transportul Enclavei securizate pentru generarea asimetrică de chei cheie
Pentru aplicațiile care manipulează date extrem de sensibile, trebuie să se ia în considerare utilizarea unui modul de securitate hardware (HSM) prin intermediul serviciilor de rețea, deși acesta introduce latență și necesită conectivitate la internet.
Rotire cheie și recriptare
Atunci când o cheie este compromisă sau după o perioadă definită (de exemplu, la fiecare 90 de zile), rotiți cheia. Aceasta implică decriptarea tuturor datelor cu cheia veche, generând o nouă cheie și recriptând. Pentru seturi mari de date, implementați un sistem de cheie modificat:
- A se păstra un identificator cheie (de exemplu, UUID) alături de fiecare înregistrare criptată.
- Păstrați o cartografiere a identificatorilor cheilor reale din Keychain (criptat în repaus).
- În timpul rotaţiei, adăugaţi o nouă intrare fără a re-cripta imediat toate datele. Re-criptarea lene la acces.
Respectarea și luarea în considerare a reglementărilor
Multe regulamente impun criptarea datelor sensibile. GDPR[] necesită măsuri tehnice adecvate, iar criptarea este o tehnică de pseudonimizare recunoscută. HIPAA[ mandate de criptare a ePHI în repaus și în tranzit. PCI DSS necesită criptarea datelor titularului cardului. În iOS, în urma orientărilor privind protecția datelor cu privire la merele, combinate cu criptarea pe straturi de aplicații, îndeplinesc majoritatea cerințelor de conformitate. Document implementarea criptării, politicile cheie privind ciclul de viață și traseele de audit pentru revizuirea regulatorului.
A se vedea documentația oficială a Apple pentru cele mai recente recomandări: CryptoKit Dezvoltator Guide[, Keychain Services și Protejarea confidențialității utilizatorilor.Pentru îndrumarea industriei, a se vedea OWASP Mobile Security Testing Guide și NIST SP 800-3,5B
Testarea și validarea
După implementarea criptarei, verificați dacă funcționează corect:
- Scrie teste de unitate care criptează și decriptează texturi simple cunoscute și afirmă ieșiri.
- Cazuri de încercare la margine: date goale, încărcături utile foarte mari și cifruri corupte.
- Efectuați teste de securitate folosind un dispozitiv de închisoare rupt pentru a simula scenarii de atac ? Verificați că cheile rămân inaccesibile fără autentificare.
- Utilizați instrumente de analiză statică pentru a asigura nici chei hardcodate sau algoritmi slabi.
- Revizuire jurnale
Concluzie
Punerea în aplicare a criptarei datelor pentru stocarea de date iOS sensibile este un proces multistratificat. Prin combinarea protecției fișierelor iOS, criptarea pe straturi de aplicații cu CryptoKit sau CommonCrypto și gestionarea strictă a cheii prin Keychain și Enclave securizate, dezvoltatorii pot reduce semnificativ riscul expunerii la date. Respectarea unor reglementări precum GDPR și HIPAA necesită practici de criptare documentate, auditabile. Testarea regulată și rotațiea cheie asigură securitatea pe termen lung. Investirea într-o arhitectură robustă de criptare nu numai că protejează datele utilizatorilor, dar și creează încredere și răspunde așteptărilor de reglementare.