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:
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.