[swift] Swift CryptoSwift로 투명한 키 관리 구현하기

안녕하세요! 이번에는 Swift CryptoSwift 라이브러리를 사용하여 투명한 키 관리를 구현하는 방법에 대해 알아보겠습니다. 이 기능을 통해 데이터를 암호화하고 복호화하는 과정을 간단하게 처리할 수 있습니다.

CryptoSwift 소개

CryptoSwift는 Swift에서 사용할 수 있는 암호화 및 해시 라이브러리입니다. 이 라이브러리를 사용하면 다양한 암호화 알고리즘과 메소드를 활용할 수 있습니다. UIView, String, Array 등과 같은 다양한 Swift 데이터 타입을 암호화하고 복호화할 수 있습니다.

키 생성 및 저장하기

첫 번째로 할 일은 암호화에 사용될 키를 생성하고 저장해야 합니다. 이를 위해 CryptoSwift를 사용하여 랜덤한 키를 생성하고, 이를 파일이나 데이터베이스와 같은 안전한 장소에 저장합니다.

import CryptoSwift

extension String {
    static func generateRandomKey(size: Int) -> String {
        let bytes = size / 8
        let data = Data(count: bytes)
        let randomData = data.map { _ in UInt8.random(in: 0 ... 255) }
        return randomData.toHexString()
    }
}

let keySize = 256
let randomKey = String.generateRandomKey(size: keySize)

위의 코드에서는 String 타입에 generateRandomKey라는 확장 함수를 정의합니다. 이 함수는 주어진 크기에 맞게 랜덤한 키를 생성하고, 해당 키를 16진수 문자열로 변환하여 반환합니다. keySize는 생성할 키의 크기를 나타내며, 일반적으로 128, 192, 256비트 중 하나를 사용합니다.

데이터 암호화 및 복호화

이제 키가 준비되었으므로 데이터를 암호화 및 복호화할 수 있습니다. CryptoSwift는 다양한 암호화 알고리즘을 제공하며, 여기에서는 가장 일반적인 AES-256을 사용하겠습니다.

import CryptoSwift

extension String {
    func encrypt(key: String) throws -> String {
        guard let data = self.data(using: .utf8) else {
            throw EncryptionError.invalidInput
        }
        
        guard let keyData = key.data(using: .utf8) else {
            throw EncryptionError.invalidKey
        }
        
        let aes = try AES(key: keyData.bytes, blockMode: .ECB)
        let encrypted = try aes.encrypt(data.bytes)
        
        return encrypted.toHexString()
    }
    
    func decrypt(key: String) throws -> String {
        let bytes = self.hexaBytes
        
        guard let keyData = key.data(using: .utf8) else {
            throw EncryptionError.invalidKey
        }
        
        let aes = try AES(key: keyData.bytes, blockMode: .ECB)
        let decrypted = try aes.decrypt(bytes)
        
        guard let decryptedData = Data(bytes: decrypted) else {
            throw EncryptionError.invalidOutput
        }
        
        guard let decryptedString = String(data: decryptedData, encoding: .utf8) else {
            throw EncryptionError.invalidOutput
        }
        
        return decryptedString
    }
}

enum EncryptionError: Error {
    case invalidInput
    case invalidKey
    case invalidOutput
}

let plaintext = "Hello, world!"
let encryptedText = try plaintext.encrypt(key: randomKey)
let decryptedText = try encryptedText.decrypt(key: randomKey)

위의 코드에서는 String 타입에 encryptdecrypt라는 확장 함수를 정의합니다. encrypt 함수는 주어진 키를 사용하여 데이터를 암호화하고, decrypt 함수는 주어진 키를 사용하여 데이터를 복호화합니다. 암호화 및 복호화는 ECB(전자 코드 북 모드)로 수행되며, 결과는 16진수 문자열로 반환됩니다.

결론

이렇게 Swift CryptoSwift 라이브러리를 사용하여 투명한 키 관리를 구현하는 방법에 대해 알아보았습니다. 키의 생성과 저장, 데이터의 암호화 및 복호화를 작업하기 위해 CryptoSwift 라이브러리를 사용할 수 있습니다. 이를 활용하여 보안성을 높인 앱을 개발할 수 있습니다.

참고 자료