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: introduzca la descripción de la imagen aquí
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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow