iOS
Безопасность
Поиск…
Вступление
Безопасность в 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.