Criptografia em Swift (iOS/macOS): criptografia e hashing
No desenvolvimento moderno para iOS e macOS, a segurança dos dados é uma das principais prioridades. A Apple fornece ferramentas integradas poderosas para proteção criptográfica: desde hashing simples até criptografia assimétrica. Neste artigo, veremos como usar CryptoKit (framework recomendado a partir do iOS 13 / macOS 10.15) e o clássico CommonCrypto para resolver tarefas típicas: criptografia, hashing e autenticação de dados.
Conceitos básicos
Antes de ir para o código, vamos entender os termos:
- Criptografia simétrica — uma chave é usada tanto para criptografar quanto para descriptografar (ex.: AES).
- Criptografia assimétrica — par de chaves: pública (para criptografar) e privada (para descriptografar).
- Hashing — transformação irreversível de dados em uma string de comprimento fixo (SHA-256).
- HMAC — código de autenticação de mensagem baseado em hash usando uma chave.
1. Hashing com CryptoKit
CryptoKit é um framework Swift moderno que torna a criptografia simples e segura. Para hashing, usa-se a estrutura SHA256.
import CryptoKit
func hashString(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}
// Exemplo de usolet password = "MySecurePass123"let hash = hashString(password)print("SHA-256 hash: \\(hash)")Também estão disponíveis SHA384, SHA512 e SHA1 (este último apenas para compatibilidade).
2. HMAC (autenticação de mensagem)
HMAC adiciona uma chave ao hash, protegendo contra falsificação. No CryptoKit, isso é implementado através de HMAC especificando o algoritmo:
import CryptoKit
func hmacSHA256(key: SymmetricKey, message: String) -> String { let messageData = Data(message.utf8) let code = HMAC<SHA256>.authenticationCode(for: messageData, using: key) return code.compactMap { String(format: "%02x", $0) }.joined()}
// Geração de chavelet key = SymmetricKey(size: .bits256)let hmac = hmacSHA256(key: key, message: "Mensagem importante")print("HMAC: \\(hmac)")3. Criptografia simétrica (AES-GCM)
AES-GCM é um modo de criptografia moderno que fornece tanto confidencialidade quanto autenticação (impede adulteração de dados). O CryptoKit o suporta nativamente.
import CryptoKit
func encryptAESGCM(plainText: String, key: SymmetricKey) throws -> Data { let plainData = Data(plainText.utf8) let sealedBox = try AES.GCM.seal(plainData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
func decryptAESGCM(encryptedData: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: encryptedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// Exemplolet key = SymmetricKey(size: .bits256)let originalText = "Dados secretos"
do { let encrypted = try encryptAESGCM(plainText: originalText, key: key) let decrypted = try decryptAESGCM(encryptedData: encrypted, key: key) print("Descriptografado: \\(decrypted)")} catch { print("Erro: \\(error)")}Importante: combined inclui tudo necessário para descriptografia (nonce, ciphertext, tag). Armazene-o junto com os dados criptografados.
4. Criptografia assimétrica (RSA) via CommonCrypto
Para RSA, o CryptoKit não fornece uma API direta, mas é possível usar Security.framework e CommonCrypto