[swift] Swift에서의 암호화와 솔트(Salt) 사용 방법

암호화는 사용자의 개인 정보나 기밀 데이터를 보호하기 위해 중요한 역할을 합니다. 암호화된 데이터를 저장할 때, 추가적인 보안을 위해 솔트(Salt)를 사용할 수 있습니다.

암호화

Swift에서 데이터를 암호화하기 위해서는 CryptoKit 프레임워크를 사용하면 됩니다. 이 프레임워크는 다양한 암호화 알고리즘을 제공하며 간단하게 사용할 수 있습니다.

대칭키 암호화 - AES

AES(Advanced Encryption Standard)는 대칭키 암호화 알고리즘으로 가장 널리 사용되는 알고리즘입니다. AES를 사용하여 데이터를 암호화하려면 다음과 같이 코드를 작성할 수 있습니다.

import CryptoKit

func encrypt(data: Data, key: SymmetricKey) throws -> Data {
    let sealedBox = try AES.GCM.seal(data, using: key)
    return sealedBox.combined
}

func decrypt(cipherText: Data, key: SymmetricKey) throws -> Data {
    let sealedBox = try AES.GCM.SealedBox(combined: cipherText)
    return try AES.GCM.open(sealedBox, using: key)
}

위의 코드는 데이터를 암호화하는 encrypt 함수와 암호화된 데이터를 복호화하는 decrypt 함수를 포함하고 있습니다. SymmetricKey 객체는 암호화 및 복호화에 사용되는 키를 나타냅니다.

비대칭키 암호화 - RSA

비대칭키 암호화 알고리즘 중 가장 보편적으로 사용되는 RSA 알고리즘을 Swift에서 사용하려면 다음과 같이 코드를 작성할 수 있습니다.

import CryptoKit

func encrypt(plainText: Data, publicKey: PublicKey) throws -> Data {
    return try plainText.encrypted(with: publicKey)
}

func decrypt(cipherText: Data, privateKey: PrivateKey) throws -> Data {
    return try cipherText.decrypted(with: privateKey)
}

위의 코드는 공개키로 데이터를 암호화하는 encrypt 함수와 개인키로 데이터를 복호화하는 decrypt 함수를 포함하고 있습니다. PublicKeyPrivateKey 객체는 각각 공개키와 개인키를 나타냅니다.

솔트 사용

솔트는 암호화된 데이터를 보다 안전하게 저장하기 위해 사용됩니다. 솔트를 사용하면 같은 비밀번호를 가진 사용자라도 암호화된 데이터가 완전히 동일하지 않습니다. Swift에서 솔트를 사용하기 위해서는 다음과 같은 단계를 따를 수 있습니다.

  1. 솔트 생성: 암호화할 때 사용할 각 사용자별 랜덤한 값인 솔트를 생성합니다.
let salt = AES.GCM.Nonce()
let saltData = salt.withUnsafeBytes { Data($0) }
  1. 솔트와 비밀번호 결합: 솔트와 사용자의 비밀번호를 결합하여 암호화를 진행합니다.
let password = "mySecretPassword"
let passwordData = password.data(using: .utf8)!
let combinedData = saltData + passwordData

let key = SymmetricKey(data: SHA256.hash(data: combinedData))
let encryptedData = try encrypt(data: data, key: key)

위의 코드에서 combinedData는 솔트와 비밀번호를 결합한 데이터입니다. 이를 SymmetricKey 객체 생성을 위한 데이터로 사용합니다.

솔트와 비밀번호를 결합하여 암호화할 때, 같은 비밀번호를 가진 사용자라도 솔트가 다르기 때문에 암호화된 결과는 다릅니다. 이를 통해 암호화된 데이터를 해독하는 데에 필요한 솔트 정보를 소요되지 않도록 보호할 수 있습니다.

참고 자료