Swift는 애플의 공식 프로그래밍 언어로서 안전하고 강력한 암호화와 파일 보안 기능을 제공합니다. 이러한 기능을 통해 앱 또는 시스템에서 사용자 데이터를 안전하게 보호할 수 있습니다.
1. 데이터 암호화
Swift에서 데이터 암호화를 위해 기본적으로 제공하는 두 가지 주요 프레임워크는 CryptoKit
과 CommonCrypto
입니다.
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
옵션을 제공합니다.
.none
: 파일을 별도로 암호화하지 않고 일반적인 방식으로 저장합니다..complete
: 파일을 암호화하여 저장합니다. 잠금 해제되지 않은 경우 액세스할 수 없습니다..completeUnlessOpen
: 잠금 해제된 동안에만 암호화를 해제하고, 잠금 상태에서는 암호화된 상태로 유지합니다..completeUntilFirstUserAuthentication
: 최초로 사용자 인증이 필요한 시점까지 파일을 암호화합니다.
파일 보호 수준을 설정하는 방법은 파일을 작성하는 동안 앱에서 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에서는 CryptoKit
과 CommonCrypto
를 통해 암호화와 파일 보안 기능을 제공합니다. 데이터 암호화를 위해 CryptoKit
을 사용하면 더 쉽고 안전한 방식으로 암호화 작업을 수행할 수 있습니다. 파일 보안은 FileProtectionType
을 사용하여 파일의 보호 수준을 지정하고 암호화하여 사용자 데이터를 보호할 수 있습니다.