[swift] Swift에서의 암호화와 파일 보안

Swift는 애플의 공식 프로그래밍 언어로서 안전하고 강력한 암호화와 파일 보안 기능을 제공합니다. 이러한 기능을 통해 앱 또는 시스템에서 사용자 데이터를 안전하게 보호할 수 있습니다.

1. 데이터 암호화

Swift에서 데이터 암호화를 위해 기본적으로 제공하는 두 가지 주요 프레임워크는 CryptoKitCommonCrypto입니다.

1.1 CryptoKit

CryptoKit은 Swift 5부터 도입된 암호화 관련 프레임워크로서, 다양한 암호화 알고리즘 및 기능을 제공합니다. CryptoKit은 고급 암호화 작업에 사용되며, 대칭 및 비대칭 암호화, 메시지 다이제스트 생성, HMAC, PBKDF2 등을 지원합니다.

예시 코드:

import CryptoKit

// AES 대칭키 암호화
let key = SymmetricKey(size: .bits256)
let plainText = Data("Hello, World!".utf8)

do {
    let sealedBox = try AES.GCM.seal(plainText, using: key)
    // 암호문 저장 및 전송
    
    let decryptedData = try AES.GCM.open(sealedBox, using: key)
    let decryptedString = String(data: decryptedData, encoding: .utf8)
    print(decryptedString) // 출력: Hello, World!
} catch {
    print("암호화 실패: \(error)")
}

1.2 CommonCrypto

CommonCrypto는 C 기반의 암호화 라이브러리로서, 낮은 수준의 암호화 작업을 수행할 때 사용됩니다. CommonCrypto는 Swift에서 직접 사용할 수 있도록 Wrapping된 함수를 제공하며, 대부분의 암호화 작업을 처리할 수 있습니다.

예시 코드:

import CommonCrypto

// AES 대칭키 암호화
let key = "secretkey".data(using: .utf8)!
let plainText = "Hello, World!".data(using: .utf8)!
let iv = "initialvector".data(using: .utf8)!

var encryptedData = Data(count: plainText.count + kCCBlockSizeAES128)
var encryptedDataLength = 0

let status = iv.withUnsafeBytes { ivPointer in
    key.withUnsafeBytes { keyPointer in
        plainText.withUnsafeBytes { dataPointer in
            CCCrypt(
                CCOperation(kCCEncrypt),
                CCAlgorithm(kCCAlgorithmAES),
                CCOptions(kCCOptionPKCS7Padding),
                keyPointer.baseAddress,
                keyPointer.count,
                ivPointer.baseAddress,
                dataPointer.baseAddress,
                dataPointer.count,
                encryptedData.baseAddress,
                encryptedData.count,
                &encryptedDataLength
            )
        }
    }
}

if status == kCCSuccess {
    encryptedData.count = encryptedDataLength
    // 암호문 저장 및 전송

    var decryptedData = Data(count: encryptedData.count)
    var decryptedDataLength = 0

    let decryptStatus = iv.withUnsafeBytes { ivPointer in
        key.withUnsafeBytes { keyPointer in
            encryptedData.withUnsafeBytes { dataPointer in
                CCCrypt(
                    CCOperation(kCCDecrypt),
                    CCAlgorithm(kCCAlgorithmAES),
                    CCOptions(kCCOptionPKCS7Padding),
                    keyPointer.baseAddress,
                    keyPointer.count,
                    ivPointer.baseAddress,
                    dataPointer.baseAddress,
                    dataPointer.count,
                    decryptedData.baseAddress,
                    decryptedData.count,
                    &decryptedDataLength
                )
            }
        }
    }

    if decryptStatus == kCCSuccess {
        decryptedData.count = decryptedDataLength
        let decryptedString = String(data: decryptedData, encoding: .utf8)
        print(decryptedString) // 출력: Hello, World!
    } else {
        print("복호화 실패")
    }
} else {
    print("암호화 실패")
}

2. 파일 보안

Swift에서 파일 보안을 위해 FileProtectionType을 사용할 수 있습니다. FileProtectionType은 파일의 보호 수준을 지정하는데 사용되며, 암호화된 파일을 디스크에 저장하거나 전송할 때 사용됩니다. Swift는 다음과 같은 FileProtectionType 옵션을 제공합니다.

파일 보호 수준을 설정하는 방법은 파일을 작성하는 동안 앱에서 FileProtectionType 옵션을 설정하거나, 파일의 속성을 변경하여 정보를 보호할 수 있습니다.

예시 코드:

import Foundation

let fileURL = URL(fileURLWithPath: "path/to/file")

do {
    try "Hello, World!".write(to: fileURL, atomically: true, encoding: .utf8)
    try fileURL.setResourceValue(URLFileProtection.complete, forKey: .fileProtectionKey)
} catch {
    print("파일 작성 및 보호 설정 실패: \(error)")
}

결론

Swift에서는 CryptoKitCommonCrypto를 통해 암호화와 파일 보안 기능을 제공합니다. 데이터 암호화를 위해 CryptoKit을 사용하면 더 쉽고 안전한 방식으로 암호화 작업을 수행할 수 있습니다. 파일 보안은 FileProtectionType을 사용하여 파일의 보호 수준을 지정하고 암호화하여 사용자 데이터를 보호할 수 있습니다.