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 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

Recommendations