Criptografía en Swift (iOS/macOS): cifrado y hash

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Criptografía en Swift (iOS/macOS): cifrado y hash



En el desarrollo moderno para iOS y macOS, la seguridad de los datos es un aspecto críticamente importante. Swift proporciona potentes herramientas integradas para criptografía, desde el CommonCrypto de bajo nivel (C-API) hasta el moderno framework CryptoKit (iOS 13+/macOS 10.15+). En este artículo, analizaremos los principales métodos de cifrado y hash disponibles para el desarrollador de Swift.



1. Hashing

El hashing es una transformación unidireccional de datos en una cadena de longitud fija. Se utiliza para verificar la integridad de los datos y almacenar contraseñas (con sal).



Ejemplo con CryptoKit (SHA-256)

import CryptoKit

func hashSHA256(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}

// Usolet hash = hashSHA256("Hello, Swift!")print("SHA-256: \\(hash)")// Salida: 8e3a... (64 caracteres)


Ejemplo con CommonCrypto (MD5, obsoleto)

Nota: MD5 no se recomienda para seguridad, pero puede usarse para control de integridad.

import CommonCrypto

func md5Hash(_ input: String) -> String { let data = Data(input.utf8) var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) data.withUnsafeBytes { bytes in _ = CC_MD5(bytes.baseAddress, CC_LONG(data.count), &digest) } return digest.map { String(format: "%02x", $0) }.joined()}


2. Cifrado simétrico (AES-GCM)

El cifrado simétrico utiliza una sola clave para cifrar y descifrar. CryptoKit proporciona una implementación segura de AES-GCM (Modo Galois/Contador).



Ejemplo de cifrado y descifrado con CryptoKit

import CryptoKit

func encryptAESGCM(plaintext: String, key: SymmetricKey) throws -> Data { let plaintextData = Data(plaintext.utf8) let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}

func decryptAESGCM(ciphertext: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: ciphertext) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}

// Usolet key = SymmetricKey(size: .bits256) // Clave de 256 bitslet encrypted = try encryptAESGCM(plaintext: "Mensaje secreto", key: key)let decrypted = try decryptAESGCM(ciphertext: encrypted, key: key)print("Descifrado: \\(decrypted)")


3. Cifrado asimétrico (RSA)

El cifrado asimétrico utiliza un par de claves: pública (para cifrar) y privada (para descifrar). En iOS/macOS, para trabajar con RSA se utiliza Security.framework y SecKey.



Ejemplo de generación de claves y cifrado RSA

import Security

func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false], kSecPublicKeyAttrs as String: [kSecAttrIsPermanent as String: false] ] guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, nil) else { return nil } let publicKey = SecKeyCopyPublicKey(privateKey)! return (privateKey, publicKey)}

func encryptRSA(plaintext: String, publicKey: SecKey) -> Data? { let plaintextData = Data(plaintext.utf8) var error: Unmanaged<CFError>? guard let ciphertext = SecKeyCreateEncryptedData( publicKey, .rsaEncryptionPKCS1, plaintextData as CFData,

Recommendations