Ricerca…


introduzione

La sicurezza in iOS è legata alla sicurezza dei dati, alla sicurezza del trasporto, alla sicurezza del codice, ecc

Sicurezza del trasporto con SSL

Le app iOS devono essere scritte in modo da fornire sicurezza ai dati che vengono trasportati sulla rete.
SSL è il modo comune per farlo.

Ogni volta che l'app tenta di chiamare i servizi Web per estrarre o inviare dati ai server, dovrebbe utilizzare SSL su HTTP, ovvero HTTPS .
Per fare ciò, l' app deve chiamare https://server.com/part tali servizi Web e non http://server.com/part .
In questo caso, l'app deve considerare attendibile il server server.com utilizzando il certificato SSL.

Ecco l'esempio di convalida della fiducia del server

Implementa URLSessionDelegate come:

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    
    if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
        let serverTrust:SecTrust = challenge.protectionSpace.serverTrust!

        func acceptServerTrust() {
            let credential:URLCredential = URLCredential(trust: serverTrust)
            challenge.sender?.use(credential, for: challenge)
            completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
        }
        
        let success = SSLTrustManager.shouldTrustServerTrust(serverTrust, forCert: "Server_Public_SSL_Cert")
        if success {
            acceptServerTrust()
            return
        }
    }
    else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate {
        completionHandler(.rejectProtectionSpace, nil);
        return
    }
    completionHandler(.cancelAuthenticationChallenge, nil)
}

Ecco il gestore di fiducia: (impossibile trovare il codice Swift)

@implementation SSLTrustManager
+ (BOOL)shouldTrustServerTrust:(SecTrustRef)serverTrust forCert:(NSString*)certName {
// Load up the bundled certificate.
NSString *certPath = [[NSBundle mainBundle] pathForResource:certName ofType:@"der"];
NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath];
CFDataRef certDataRef = (__bridge_retained CFDataRef)certData;
SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef);

// Establish a chain of trust anchored on our bundled certificate.
CFArrayRef certArrayRef = CFArrayCreate(NULL, (void *)&cert, 1, NULL);
SecTrustSetAnchorCertificates(serverTrust, certArrayRef);

// Verify that trust.
SecTrustResultType trustResult;
SecTrustEvaluate(serverTrust, &trustResult);

// Clean up.
CFRelease(certArrayRef);
CFRelease(cert);
CFRelease(certDataRef);

// Did our custom trust chain evaluate successfully?
return trustResult == kSecTrustResultUnspecified;
}
@end

Server_Public_SSL_Cert.der è la chiave SSL pubblica dei server.

Utilizzando questo approccio la nostra app può assicurarsi che stia comunicando con il server previsto e nessuno stia intercettando la comunicazione app-server.

Protezione dei dati nei backup di iTunes

Se vogliamo che i nostri dati delle app siano protetti dai backup di iTunes, dobbiamo saltare i nostri dati delle app dal backup su iTunes.
Ogni volta che il dispositivo iOS esegue il backup utilizzando iTunes su macOS, tutti i dati memorizzati da tutte le app vengono copiati in quel backup e archiviati sul computer di backup.

Ma possiamo escludere i dati delle nostre app da questo backup utilizzando la chiave URLResourceKey.isExcludedFromBackupKey .
Ecco la struttura delle directory della nostra app: inserisci la descrizione dell'immagine qui
Nota: i dati generalmente sensibili sono memorizzati nella directory 'Application Support'.

Ad esempio, se vogliamo escludere tutti i nostri dati memorizzati nella directory del supporto applicativo , possiamo utilizzare la suddetta chiave come segue:

    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    let baseURL = urls[urls.count-1];
    
    let bundleIdentifier = Bundle.main.object(forInfoDictionaryKey: "CFBundleIdentifier") as! String
    let pathURL = baseURL.appendingPathComponent(bundleIdentifier)
    let persistentStoreDirectoryPath = pathURL.path
    if !FileManager.default.fileExists(atPath: persistentStoreDirectoryPath) {
        do {
            try FileManager.default.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: nil)  
        }catch {
            //handle error
        }
    }
    let dirURL = URL.init(fileURLWithPath: persistentStoreDirectoryPath, isDirectory: true)
    do {
        try (dirURL as NSURL).setResourceValue((true), forKey: .isExcludedFromBackupKey)
    } catch {
        //handle error
    }

Ci sono molti strumenti disponibili per vedere i backup di iTunes per tutti i dati di backup per confermare se l'approccio sopra funziona o meno.
iExplorer è buono per esplorare i backup di iTunes.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow