Suche…


Einführung

Die Sicherheit von iOS bezieht sich auf Datensicherheit, Transportsicherheit, Codesicherheit usw

Transportsicherheit mit SSL

iOS-Apps müssen so geschrieben werden, dass die Daten, die über das Netzwerk transportiert werden, geschützt werden.
SSL ist die übliche Methode, dies zu tun.

Immer, wenn die App versucht, Web-Services aufzurufen, um Daten auf Server zu laden oder zu übertragen, sollte sie SSL über HTTP, dh HTTPS, verwenden .
Dazu muss die App https://server.com/part solcher Webdienste und nicht http://server.com/part aufrufen .
In diesem Fall muss die App dem Server server.com mithilfe des SSL-Zertifikats vertrauen.

Hier ist das Beispiel für die Überprüfung der Server-Vertrauenswürdigkeit.

Implementieren Sie URLSessionDelegate als:

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)
}

Hier ist der Vertrauensmanager: (Swift-Code konnte nicht gefunden werden)

@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 ist der öffentliche SSL-Schlüssel der Server.

Mit diesem Ansatz kann unsere App sicherstellen, dass sie mit dem beabsichtigten Server kommuniziert und dass niemand die App-Server-Kommunikation abfängt.

Sichern von Daten in iTunes-Backups

Wenn unsere App-Daten vor iTunes-Sicherungen geschützt werden sollen, müssen wir die App-Daten von der Sicherung in iTunes auslassen.
Wenn ein iOS-Gerät mit iTunes auf macOS gesichert wird, werden alle von allen Apps gespeicherten Daten in dieses Backup kopiert und auf dem Sicherungscomputer gespeichert.

Wir können jedoch unsere App-Daten mit Hilfe URLResourceKey.isExcludedFromBackupKey Schlüssels URLResourceKey.isExcludedFromBackupKey von dieser Sicherung URLResourceKey.isExcludedFromBackupKey .
Hier ist die Verzeichnisstruktur unserer App: Geben Sie hier die Bildbeschreibung ein
Hinweis: Im Allgemeinen werden sensible Daten im Verzeichnis 'Application Support' gespeichert.

Wenn Sie beispielsweise alle im Application Support- Verzeichnis gespeicherten Daten ausschließen möchten, können Sie den oben genannten Schlüssel wie folgt verwenden:

    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
    }

Es gibt zahlreiche Tools zum Anzeigen von iTunes-Backups für alle gesicherten Daten, um zu überprüfen, ob der oben beschriebene Ansatz funktioniert oder nicht.
iExplorer eignet sich gut zum Durchsuchen von iTunes-Backups.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow