Ingegneria civile e strutturale
Implementazione della crittografia dei dati per lo stoccaggio dei dati sensibili
Table of Contents
Comprendere la crittografia dei dati su iOS
A livello hardware, la Secure Enclave gestisce le chiavi di crittografia e le operazioni crittografiche. A livello di sistema operativo, [ Protezione dei dati] utilizza la crittografia a livello di file che lega i tasti di decrittazione al codice di passaggio del dispositivo.
La crittografia converte il testo in testo cifrato utilizzando un algoritmo e una chiave. Senza la chiave corretta, i dati rimangono illeggibili. Apple [iOS Data Protection API[[]] crittografa automaticamente i file a riposo, ma gli sviluppatori hanno bisogno di una crittografia esplicita per i dati memorizzati al di fuori del file system protetto, come in Dati core, UserDefaults o cache personalizzate.
Il takeaway chiave: crittografare i dati sensibili ogni volta che risiede sul dispositivo[[[], anche se la crittografia iOS è abilitata per impostazione predefinita. Ciò garantisce la protezione contro l'accesso fisico del dispositivo, l'estrazione forense, o applicazioni dannose in esecuzione nella stessa sandbox.
I Quadri e le API di crittografia iOS
La scelta di una corretta dipende dal target di distribuzione e dal livello di controllo richiesto.
CryptoKit – Modern Swift API
Introdotto in iOS 13, CryptoKit offre un'interfaccia Swift-native per la crittografia simmetrica e asimmetrica, hashing e accordo chiave. Utilizza [AES-GCM[] per la crittografia autenticata, che protegge sia la riservatezza che l'integrità.
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)
}
Conservare sempre il nella Portachiavi, non in UserDefaults o in un file semplice. Usa [ con ] per legare la chiave al dispositivo e alla presenza dell'utente.
CommonCrypto – Flessibilità basata su C
Per le applicazioni che supportano le versioni iOS più vecchie o che richiedono modalità di cifratura personalizzate (ad esempio, CBC con HMAC), CommonCrypto fornisce funzioni C di basso livello. Supporta AES, DES, 3DES e vari algoritmi di hashing. Esempio di crittografia 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 richiede la gestione manuale dei vettori di inizializzazione (IVs) e dei tag di autenticazione.Per la crittografia autenticata, coppia AES-CBC con HMAC separato, o passare a AES-GCM tramite CryptoKit quando possibile.
Quadro di sicurezza e portachiavi
Il framework di sicurezza fornisce servizi Keychain per la memorizzazione sicura di chiavi, certificati e password. Utilizzare per memorizzare le chiavi con controlli di accesso rigorosi (ad esempio, richiedono la presenza dell'utente tramite biometrica).
Crittografia di implementazione per diversi tipi di dati
Non tutti i dati hanno bisogno della stessa strategia di crittografia.
Crittografia dei default dell'utente e dei dati core
I Data Manager e i Core Data Store sono file SQLite semplici a meno che non siano crittografati. Per Core Data, abilitare l'attributo NSFileProtectionType[[]]] sul file store.
- Utilizzare Dati Nuclei ]trasformabili[] attributi con un trasformatore di valore personalizzato che crittografa / decifra sulla lettura / scrittura.
- Serializzare l'intero oggetto gestito come JSON, crittografarlo e memorizzare il testo cifrato in un attributo binario.
- Per UserDefaults, non memorizzare stringhe sensibili crude; crittografare ogni valore e memorizzare i dati crittografati.
Esempio di memorizzazione dei dati crittografati in UserDefaults:
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()
Crittografia di file con protezione file
iOS offre classi di protezione a livello di file: [, [, e [].
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("data.bin")
try FileManager.default.setAttributes([.protectionKey: FileProtectionType.complete], ofItemAtPath: fileURL.path)
Combina la protezione dei file con una crittografia esplicita se i dati devono rimanere protetti anche quando il dispositivo viene sbloccato. Ad esempio, crittografare il file con una chiave memorizzata nella Keychain e accessibile solo dopo l'autenticazione.
Crittografia dati di rete (Transport Layer Security)
Per connessioni TCP personalizzate, utilizzare con TLS o implementare la pinning SSL per prevenire attacchi di tipo umano-in-the-middle. Crittografare il carico di pagamento allo strato di applicazione per ulteriori difese-in-profondità: anche se TLS è compromessa, i dati rimangono protetti.
Migliori pratiche di gestione chiave
La crittografia è forte solo come la gestione chiave. Seguire queste linee guida per mantenere la sicurezza:
- Clicca di Generate utilizzando un generatore di numeri casuali crittografico [] – Usa ] o .
- I tasti di ripristino esclusivamente nella Keychain[[]] con gli attributi di accessibilità appropriati: [] previene il backup e lega la chiave al dispositivo.
- Utilizzare l'autenticazione biometrica o password[[] prima di recuperare la chiave – [] con []] forza la verifica dell'utente.
- I tasti di rotazione su un programma o dopo un evento di sicurezza[[] – Ri-crittografare i dati con nuove chiavi e cancellare in modo sicuro le vecchie chiavi.
- Non codici duri[[[]]] in codice sorgente o file di configurazione.
- Levare l'Enclave Sicuro[[] per la generazione di chiavi asimmetriche – le chiavi private non possono essere esportate, impedendo l'esfiltrazione.
Per le applicazioni che gestiscono dati altamente sensibili, considerare l'utilizzo di un modulo di sicurezza hardware (HSM)[[] tramite servizi di rete, anche se che introduce latenza e richiede connettività internet.
Rotazione chiave e crittografia
Quando una chiave viene compromessa o dopo un periodo definito (ad esempio, ogni 90 giorni), ruotare la chiave. Ciò comporta la decifrazione di tutti i dati con la vecchia chiave, generando una nuova chiave e ri-crittografando. Per grandi set di dati, implementare un sistema di chiave versione:
- Conservare un identificatore chiave (ad esempio UUID) accanto a ogni record crittografato.
- Mantenere una mappatura di identificatori a chiavi reali nel Keychain (crittografato a riposo).
- Durante la rotazione, aggiungere una nuova voce senza ri-crittografare immediatamente tutti i dati.
Considerazioni di conformità e regolamentazione
GDPR] richiede misure tecniche appropriate, e la crittografia è una tecnica riconosciuta di pseudonimizzazione. HIPAA manda la crittografia di ePHI a riposo e in transito. PCI DSS richiede la crittografia delle linee guida di controllo della carta.
] Guida agli sviluppatori [[FLT:], , , , e Protezione della privacy degli utenti]. Per l'orientamento del settore, vedere Guida alla sicurezza mobile
Test e convalida
Dopo aver implementato la crittografia, verificare che funzioni correttamente:
- Scrivere test unità che crittografano e decifrano i testi semplici noti e asseriscono le uscite.
- Test casi di bordo: dati vuoti, carichi di pagamento molto grandi e testi cifrati corrotti.
- Eseguire i test di sicurezza utilizzando un dispositivo jailbroken per simulare scenari di attacco, verifica che le chiavi rimangano inaccessibili senza autenticazione.
- Utilizzare strumenti di analisi statica per garantire senza chiavi in codice rigido o algoritmi deboli.
- Registri di revisione – mai log dati sensibili a testo chiaro o chiavi di crittografia.
Conclusioni
L'implementazione della crittografia dei dati per la conservazione dei dati iOS sensibile è un processo multi-strato. Combinando la protezione dei file iOS, la crittografia a livello di applicazione con CryptoKit o CommonCrypto, e la gestione rigorosa delle chiavi tramite Keychain e Secure Enclave, gli sviluppatori possono ridurre significativamente il rischio di esposizione dei dati.