Sök…


Introduktion

Säkerhet i iOS är relaterat till datasäkerhet, transportsäkerhet, kodsäkerhet osv

Transportsäkerhet med SSL

iOS-appar måste skrivas på ett sätt som ger säkerhet för data som transporteras över nätverk.
SSL är det vanliga sättet att göra det.

Varje gång app försöker ringa webbtjänster för att dra eller skjuta data till servrar bör den använda SSL över HTTP, dvs. HTTPS .
För att göra detta måste appen ringa https://server.com/part sådana webbtjänster och inte http://server.com/part .
I detta fall måste appen lita på servern server.com med SSL-certifikat.

Här är exemplet på validering av serverförtroende-

Implementera URLSessionDelegate som:

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

Här är trust manager: (kunde inte hitta Swift-kod)

@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 är servrarnas offentliga SSL-nyckel.

Med den här metoden kan vår app se till att den kommunicerar till den avsedda servern och ingen fångar upp app-serverkommunikationen.

Säkra data i iTunes-säkerhetskopior

Om vi vill att våra appdata ska skyddas mot iTunes-säkerhetskopior måste vi hoppa över våra appdata från att säkerhetskopieras i iTunes.
Närhelst iOS-enhet säkerhetskopieras med iTunes på macOS, kopieras all data som lagras av alla appar i den säkerhetskopian och lagras på säkerhetskopieringsdatorn.

Men vi kan utesluta våra appdata från denna säkerhetskopia med URLResourceKey.isExcludedFromBackupKey nyckel.
Här är katalogstrukturen för vår app: ange bildbeskrivning här
Obs: Allmänt känslig information lagras i katalogen "Support för applikationer".

t.ex. om vi vill utesluta alla våra data lagrade i applikationssupportkatalogen kan vi använda ovan nämnda nyckel enligt följande:

    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
    }

Det finns många verktyg tillgängliga för att se iTunes-säkerhetskopior för alla säkerhetskopierade data för att bekräfta om ovanstående metod fungerar eller inte.
iExplorer är bra att utforska iTunes-säkerhetskopior.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow