수색…
소개
iOS의 보안은 데이터 보안, 전송 보안, 코드 보안 등과 관련이 있습니다.
SSL을 사용한 전송 보안
iOS 앱은 네트워크를 통해 전송되는 데이터에 보안을 제공하는 방식으로 작성되어야합니다.
SSL을 사용하는 일반적인 방법입니다.
앱이 웹 서비스를 호출하여 서버에 데이터를 가져 오거나 푸시하려고 할 때마다 HTTP를 통한 SSL, 즉 HTTPS를 사용해야합니다 .
이렇게하려면 앱에서 http://server.com/part
아니라 https://server.com/part
같은 웹 서비스를 호출해야합니다 .
이 경우 앱은 SSL 인증서를 사용하여 server.com
을 신뢰해야합니다.
다음은 서버 트러스트를 검증하는 예제입니다.
URLSessionDelegate
를 다음과 같이 구현 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)
}
여기 트러스트 매니저가 있습니다 : (스위프트 코드를 찾을 수 없음)
@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에서 백업 한 앱 데이터를 건너 뛰어야합니다.
Mac OS에서 iTunes를 사용하여 iOS 장치를 백업 할 때마다 모든 응용 프로그램에 저장된 모든 데이터가 해당 백업에 복사되고 백업 컴퓨터에 저장됩니다.
그러나 URLResourceKey.isExcludedFromBackupKey
키를 사용 URLResourceKey.isExcludedFromBackupKey
백업에서 앱 데이터를 제외 할 수 있습니다.
다음은 앱의 디렉토리 구조입니다.
참고 : 일반적으로 민감한 데이터는 'Application Support'디렉토리에 저장됩니다.
예를 들어, Application Support 디렉토리에 저장된 모든 데이터를 제외하려면 다음과 같이 위에서 언급 한 키를 사용할 수 있습니다.
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 백업을 탐색하는 데 적합합니다.