수색…


소개

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 백업을 탐색하는 데 적합합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow