Criptografia em Swift: criptografia e hash para iOS/macOS

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

Recommendations