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

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



La seguridad de los datos es un aspecto clave en el desarrollo para iOS y macOS. Swift proporciona potentes herramientas para la protección criptográfica: desde el framework integrado CryptoKit (a partir de iOS 13 / macOS 10.15) hasta la biblioteca de bajo nivel CommonCrypto (biblioteca C). En este artículo analizaremos las operaciones principales: cifrado simétrico (AES), asimétrico (RSA), hash (SHA-256) y autenticación de mensajes (HMAC).



1. Configuración del proyecto



Para usar CryptoKit no se requiere configuración adicional: forma parte de la biblioteca estándar Foundation. Si trabajas con CommonCrypto, agrégalo al Bridging-Header (para Swift + ObjC) o importa el módulo directamente:



// Para CommonCrypto en Swift 5+ se puede usar:import CommonCrypto// O configurar un puente modular (modulemap)


2. Cifrado simétrico (AES-GCM) con CryptoKit



CryptoKit proporciona una API de alto nivel para AES en modo GCM (Galois/Counter Mode): una forma segura y sencilla de cifrar.



import CryptoKitimport Foundation

// Función para cifrar una cadenafunc encryptString(_ plaintext: String, using key: SymmetricKey) throws -> Data { let plaintextData = plaintext.data(using: .utf8)! let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}

// Función para descifrarfunc decryptData(_ combinedData: Data, using key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: combinedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}

// Ejemplo de usolet key = SymmetricKey(size: .bits256) // Clave de 256 bitslet original = "Mensaje secreto para iOS"let encrypted = try encryptString(original, using: key)print("Cifrado: \\(encrypted.base64EncodedString())")

let decrypted = try decryptData(encrypted, using: key)print("Descifrado: \\(decrypted)")


Importante: SymmetricKey se genera aleatoriamente. Para una aplicación real, la clave debe almacenarse en Keychain o usar Secure Enclave.



3. Hash (SHA-256) y HMAC



El hash es una función unidireccional, esencial para verificar la integridad de los datos y almacenar contraseñas. CryptoKit soporta SHA-256, SHA-384, SHA-512.



import CryptoKit

func sha256Hash(of data: Data) -> String { let digest = SHA256.hash(data: data) return digest.compactMap { String(format: "%02x", $0) }.joined()}

// Ejemplo para una cadenalet message = "¡Hola, Swift Crypto!"let hash = sha256Hash(of: message.data(using: .utf8)!)print("SHA-256: \\(hash)")


Para autenticación de mensajes (HMAC), usa HMAC con una clave:



func hmacSHA256(key: SymmetricKey, data: Data) -> Data {    let authenticationCode = HMAC<SHA256>.authenticationCode(for: data, using: key)    return Data(authenticationCode)}

let hmacKey = SymmetricKey(size: .bits256)let hmacResult = hmacSHA256(key: hmacKey, data: "Datos importantes".data(using: .utf8)!)print("HMAC: \\(hmacResult.base64EncodedString())")


4. Cifrado asimétrico (RSA) mediante Security framework



Para RSA, usa el framework Security (SecKey). CryptoKit no soporta RSA directamente, pero puedes combinar enfoques.



import Security

// Generación de un par de claves RSA (2048 bits)func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kS

Recommendations