[ios] 암호화 프레임워크 설계

iOS 애플리케이션에서 사용되는 데이터를 안전하게 보호하기 위해 암호화는 중요한 요소입니다. 사용자의 개인정보, 인증 토큰, 민감한 비즈니스 데이터 등을 안전하게 저장하고 전송하기 위해서는 적절한 암호화가 필요합니다. 이를 위해 iOS에서는 다양한 암호화 기술과 프레임워크를 제공하고 있습니다.

1. Keychain Services

Keychain Services는 iOS 애플리케이션에서 보안 정보를 안전하게 저장하기 위한 프레임워크입니다. 개인 식별 정보, 비밀번호, 키, 인증서 등을 안전하게 저장하고 관리할 수 있습니다. 암호화된 상태로 데이터를 저장하여 보안성을 유지합니다.

예를 들어, 사용자의 로그인 정보를 저장할 때 Keychain Services를 사용하여 사용자 이름과 비밀번호를 안전하게 저장할 수 있습니다.

아래는 Keychain Services를 사용하여 데이터를 저장하고 가져오는 예제 코드입니다.

import UIKit
import Security

let key = "MyKey"
let data = "MySecretData".data(using: .utf8)!

let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: key,
    kSecValueData as String: data
]

let status = SecItemAdd(query as CFDictionary, nil)

if status == errSecSuccess {
    print("Data added to keychain")
} else {
    print("Error adding data to keychain")
}

let fetchQuery: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrAccount as String: key,
    kSecReturnData as String: true
]

var result: AnyObject?
let fetchStatus = SecItemCopyMatching(fetchQuery as CFDictionary, &result)

if fetchStatus == errSecSuccess, let data = result as? Data {
    let value = String(data: data, encoding: .utf8)
    print("Retrieved data from keychain: \(value ?? "N/A")")
} else {
    print("Error fetching data from keychain")
}

2. CommonCrypto

CommonCrypto는 iOS에서 데이터를 안전하게 암호화하고 복호화하기 위한 프레임워크입니다. 이를 사용하여 데이터를 암호화하여 저장하거나, 전송 시에 사용자의 개인정보를 보호할 수 있습니다.

아래는 CommonCrypto를 사용하여 데이터를 암호화하고 복호화하는 예제 코드입니다.

import CommonCrypto
import Foundation

func encryptData(data: Data, key: Data, iv: Data) -> Data? {
    var encryptedData = Data(count: data.count + kCCBlockSizeAES128)
    var bytesEncrypted = 0

    let cryptStatus = data.withUnsafeBytes { dataBytes in
        CCCrypt(CCOperation(kCCEncrypt),
                CCAlgorithm(kCCAlgorithmAES),
                CCOptions(kCCOptionPKCS7Padding),
                key,
                key.count,
                iv,
                dataBytes.baseAddress,
                data.count,
                encryptedData.withUnsafeMutableBytes { encryptedDataPtr in
                    encryptedDataPtr.baseAddress
                },
                encryptedData.count,
                &bytesEncrypted)
    }

    if cryptStatus == kCCSuccess {
        encryptedData.count = bytesEncrypted
        return encryptedData
    } else {
        return nil
    }
}

func decryptData(data: Data, key: Data, iv: Data) -> Data? {
    var decryptedData = Data(count: data.count + kCCBlockSizeAES128)
    var bytesDecrypted = 0

    let cryptStatus = data.withUnsafeBytes { dataBytes in
        CCCrypt(CCOperation(kCCDecrypt),
                CCAlgorithm(kCCAlgorithmAES),
                CCOptions(kCCOptionPKCS7Padding),
                key,
                key.count,
                iv,
                dataBytes.baseAddress,
                data.count,
                decryptedData.withUnsafeMutableBytes { decryptedDataPtr in
                    decryptedDataPtr.baseAddress
                },
                decryptedData.count,
                &bytesDecrypted)
    }

    if cryptStatus == kCCSuccess {
        decryptedData.count = bytesDecrypted
        return decryptedData
    } else {
        return nil
    }
}

결론

이와 같이 iOS에서는 Keychain ServicesCommonCrypto를 사용하여 데이터를 안전하게 저장하고 전송할 수 있습니다. 다만, 암호화는 반드시 안전성을 고려하여 설계되어야 하며, 적절한 키 관리 및 보안취약점에 대한 고려가 필요합니다.

참고문헌:

이제 iOS 암호화 프레임워크를 설계하는 데 도움이 되었기를 바랍니다.