[swift] Swift에서의 암호화 후 데이터 무결성 검증 방법

애플리케이션을 개발할 때, 데이터의 보안과 무결성은 매우 중요한 요소입니다. 암호화는 데이터를 안전하게 보호하는데 도움을 줍니다. 이 글에서는 Swift에서 데이터를 암호화한 후에 데이터의 무결성을 검증하는 방법에 대해 살펴보겠습니다.

암호화

Swift에서 데이터를 암호화하기 위해서는 보안 라이브러리를 사용해야합니다. 일반적으로 CommonCrypto 라이브러리를 사용하여 암호화 작업을 수행할 수 있습니다. 다음은 Swift에서 문자열을 AES 알고리즘을 사용하여 암호화하는 예제입니다.

import CommonCrypto

func encryptString(string: String, key: String) -> Data? {
    let data = string.data(using: .utf8)!
    let keyData = key.data(using: .utf8)!
    
    let bufferSize = data.count + kCCBlockSizeAES128
    var buffer = [UInt8](repeating: 0, count: bufferSize)
    var numBytesEncrypted: size_t = 0
    
    let cryptStatus = CCCrypt(CCOperation(kCCEncrypt),
                              CCAlgorithm(kCCAlgorithmAES),
                              CCOptions(kCCOptionPKCS7Padding),
                              keyData.bytes, keyData.count,
                              nil,
                              data.bytes, data.count,
                              &buffer, bufferSize,
                              &numBytesEncrypted)
    
    if cryptStatus == kCCSuccess {
        return Data(bytes: buffer, count: numBytesEncrypted)
    } else {
        return nil
    }
}

위의 예제는 입력 문자열과 암호화에 사용할 키를 인자로 받아서 AES 알고리즘을 사용하여 문자열을 암호화한 후 Data로 반환합니다.

데이터 무결성 검증

데이터 무결성은 암호화된 데이터가 변경되지 않았는지 확인하는 과정입니다. 이를 위해서는 암호화된 데이터와 함께 사용할 HMAC(Hash-based Message Authentication Code)을 생성하는 것이 일반적입니다. HMAC은 암호화된 데이터를 변조하려는 시도를 감지할 수 있도록 해시 함수와 비밀 키를 사용하여 메시지 인증 코드를 생성합니다.

다음은 Swift에서 HMAC을 생성하는 예제입니다.

import CommonCrypto

func generateHMAC(data: Data, key: String) -> Data? {
    let keyData = key.data(using: .utf8)!
    
    var hmac = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256),
           keyData.bytes, keyData.count,
           (data as NSData).bytes, data.count,
           &hmac)
    
    return Data(bytes: hmac, count: Int(CC_SHA256_DIGEST_LENGTH))
}

위의 예제는 입력 데이터와 HMAC에 사용할 키를 인자로 받아서 SHA256 해시 알고리즘을 사용하여 HMAC을 생성한 후 Data로 반환합니다.

암호화 후 데이터 무결성 검증 방법

이제 데이터를 암호화하고 HMAC을 생성하는 함수를 사용하여 데이터의 무결성을 검증하는 방법을 알아봅시다.

let originalString = "Hello, World!"
let encryptionKey = "ThisIsMyEncryptionKey"
let hmacKey = "ThisIsMyHMACKey"

// 데이터 암호화
guard let encryptedData = encryptString(string: originalString, key: encryptionKey) else {
    print("Encryption failed")
    return
}

// HMAC 생성
guard let hmac = generateHMAC(data: encryptedData, key: hmacKey) else {
    print("HMAC generation failed")
    return
}

// 데이터 전송 시 encryptedData와 함께 hmac을 전송
// 받은 측에서는 받은 데이터의 HMAC을 생성하고 이전에 전송한 HMAC과 비교하여 데이터의 무결성을 확인합니다.

위의 예제에서는 originalStringencryptionKey를 사용하여 암호화하고, 암호화된 데이터로부터 hmac을 생성합니다. 이후 데이터를 전송할 때 암호화된 데이터와 함께 hmac을 전송합니다. 데이터를 받은 측에서는 받은 데이터로부터 새로운 hmac을 생성하고 이전에 전송한 hmac과 비교하여 데이터의 무결성을 확인할 수 있습니다.

결론

Swift에서 데이터의 암호화와 무결성 검증은 매우 중요한 보안 요소입니다. CommonCrypto 라이브러리를 사용하여 데이터를 암호화하고 HMAC을 생성하여 데이터의 무결성을 검증할 수 있습니다. 이를 통해 애플리케이션에서 민감한 데이터를 안전하게 보호할 수 있습니다.

참고 자료