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 También en la biblioteca
LeakCanary para Kotlin: guía completa con ejemplos prácticos
Envío de email en Kotlin: bibliotecas, ejemplos y configuración SMTP
Geolocalización y mapas en PHP: revisión de bibliotecas y herramientas
Planificador de tareas en Go (Golang): cron, gocron y asynq