Buscar..
Introducción
La seguridad en iOS está relacionada con la seguridad de datos, seguridad de transporte, seguridad de código, etc.
Seguridad de transporte utilizando SSL
Las aplicaciones de iOS se deben escribir de manera que proporcionen seguridad a los datos que se transportan a través de la red.
SSL es la forma común de hacerlo.
Cada vez que la aplicación intenta llamar a servicios web para extraer o enviar datos a servidores, debe usar SSL a través de HTTP, es decir, HTTPS .
Para hacer esto, la aplicación debe llamar a https://server.com/part
dichos servicios web y no a http://server.com/part
.
En este caso, la aplicación debe confiar en el servidor server.com
mediante un certificado SSL.
Aquí está el ejemplo de validación de la confianza del servidor
Implementar URLSessionDelegate
como:
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)
}
Aquí está el administrador de confianza: (no se pudo encontrar el código 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 es la clave pública SSL de los servidores.
Usando este enfoque, nuestra aplicación puede asegurarse de que se está comunicando con el servidor deseado y que nadie está interceptando la comunicación entre la aplicación y el servidor.
Protección de datos en las copias de seguridad de iTunes
Si queremos que los datos de nuestra aplicación estén protegidos contra las copias de seguridad de iTunes, debemos omitir que los datos de nuestra aplicación se copien en iTunes.
Cada vez que se realiza una copia de seguridad del dispositivo iOS con MacOS, todos los datos almacenados por todas las aplicaciones se copian en esa copia de seguridad y se almacenan en la computadora de respaldo.
Pero podemos excluir los datos de nuestra aplicación de esta copia de seguridad usando la clave URLResourceKey.isExcludedFromBackupKey
.
Aquí está la estructura de directorios de nuestra aplicación:
Nota: En general, los datos confidenciales se almacenan en el directorio "Soporte de aplicaciones".
Por ejemplo, si queremos excluir todos nuestros datos almacenados en el directorio de Soporte de aplicaciones , podemos usar la clave mencionada anteriormente de la siguiente manera:
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
}
Hay muchas herramientas disponibles para ver las copias de seguridad de iTunes de todos los datos respaldados para confirmar si el enfoque anterior funciona o no.
iExplorer es bueno para explorar las copias de seguridad de iTunes.