Поиск…


Вступление

Безопасность в iOS связана с безопасностью данных, безопасностью транспорта, защитой кода и т. Д.

Безопасность транспорта с использованием SSL

Приложения iOS должны быть написаны таким образом, чтобы обеспечить безопасность данных, которые транспортируются по сети.
SSL - это общий способ сделать это.

Всякий раз, когда приложение пытается вызвать веб-службы, чтобы вытащить или перенаправить данные на серверы, он должен использовать SSL через HTTP, то есть HTTPS .
Для этого приложение должно вызывать https://server.com/part такие веб-службы, а не http://server.com/part .
В этом случае приложение должно доверять серверу server.com с использованием сертификата SSL.

Ниже приведен пример проверки доверия к серверу,

Внедрить URLSessionDelegate как:

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

Вот менеджер доверия: (не удалось найти код 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 является общедоступным SSL-сервером.

Используя этот подход, наше приложение может убедиться в том, что оно связано с предполагаемым сервером, и никто не перехватывает связь приложения с сервером.

Защита данных в резервных копиях iTunes

Если мы хотим, чтобы наши данные приложений были защищены от резервных копий iTunes, мы должны пропустить данные наших приложений из резервной копии в iTunes.
Всякий раз, когда устройство iOS резервируется с помощью iTunes на macOS, все данные, хранящиеся во всех приложениях, копируются в эту резервную копию и сохраняются на резервном компьютере.

Но мы можем исключить данные приложения из этой резервной копии, используя ключ URLResourceKey.isExcludedFromBackupKey .
Вот структура каталогов нашего приложения: введите описание изображения здесь
Примечание. Обычно конфиденциальные данные хранятся в каталоге «Поддержка приложений».

например, если мы хотим исключить все наши данные, хранящиеся в каталоге поддержки приложений, мы можем использовать вышеупомянутый ключ следующим образом:

    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
    }

Существует множество инструментов для просмотра резервных копий iTunes для всех резервных копий данных, чтобы подтвердить, работает ли над ним подход или нет.
iExplorer - хороший инструмент для поиска резервных копий iTunes.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow