Criptografia em Swift (iOS/macOS): criptografia e hash
Segurança de dados é um aspecto fundamental do desenvolvimento para iOS e macOS. Swift oferece ferramentas poderosas para proteção criptográfica: desde o framework nativo CryptoKit (a partir do iOS 13 / macOS 10.15) até a biblioteca de baixo nível CommonCrypto (biblioteca C). Neste artigo, abordaremos as principais operações: criptografia simétrica (AES), assimétrica (RSA), hash (SHA-256) e autenticação de mensagens (HMAC).
1. Configuração do projeto
Para usar o CryptoKit, nenhuma configuração adicional é necessária — ele faz parte da biblioteca padrão Foundation. Se você estiver trabalhando com CommonCrypto, adicione ao Bridging-Header (para Swift + ObjC) ou importe o módulo diretamente:
// Para CommonCrypto no Swift 5+, você pode usar:import CommonCrypto// Ou configurar uma ponte de módulo (modulemap)2. Criptografia simétrica (AES-GCM) com CryptoKit
CryptoKit fornece uma API de alto nível para AES no modo GCM (Galois/Counter Mode) — uma maneira segura e simples de criptografar.
import CryptoKitimport Foundation
// Função para criptografar uma stringfunc 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}
// Função para descriptografarfunc 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)!}
// Exemplo de usolet key = SymmetricKey(size: .bits256) // Chave de 256 bitslet original = "Mensagem secreta para iOS"let encrypted = try encryptString(original, using: key)print("Criptografado: \\(encrypted.base64EncodedString())")
let decrypted = try decryptData(encrypted, using: key)print("Descriptografado: \\(decrypted)")Importante: SymmetricKey é gerado aleatoriamente. Para um aplicativo real, a chave deve ser armazenada no Keychain ou usar o Secure Enclave.
3. Hash (SHA-256) e HMAC
Hash é uma função unidirecional, essencial para verificar a integridade dos dados e armazenar senhas. CryptoKit suporta 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()}
// Exemplo para stringlet message = "Olá, Swift Crypto!"let hash = sha256Hash(of: message.data(using: .utf8)!)print("SHA-256: \\(hash)")Para autenticação de mensagens (HMAC), use HMAC com uma chave:
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: "Dados importantes".data(using: .utf8)!)print("HMAC: \\(hmacResult.base64EncodedString())")4. Criptografia assimétrica (RSA) via Security framework
Para RSA, use o framework Security (SecKey). O CryptoKit não suporta RSA diretamente, mas você pode combinar abordagens.
import Security
// Geração de par de chaves RSA (2048 bits)func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kS Também na biblioteca
Cliente OAuth para TypeScript: integração de autorização em aplicações web
Frameworks CLI para Java: Picocli, JCommander e Spring Shell
Cliente Redis para Go (Golang): go-redis e redigo — guia completo
Serialização de objetos em Swift (iOS/macOS): Codable, JSON e PropertyList