Criptografia em Swift (iOS/macOS): criptografia e hash

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



No desenvolvimento moderno para iOS e macOS, a segurança dos dados é um aspecto criticamente importante. O Swift oferece ferramentas integradas poderosas para criptografia, desde o CommonCrypto (C-API) de baixo nível até o framework moderno CryptoKit (iOS 13+/macOS 10.15+). Neste artigo, abordaremos os principais métodos de criptografia e hash disponíveis para o desenvolvedor Swift.



1. Hash (Hashing)

Hash é uma transformação unidirecional de dados em uma string de comprimento fixo. É usado para verificar a integridade dos dados e armazenar senhas (com salt).



Exemplo com CryptoKit (SHA-256)

import CryptoKit

func hashSHA256(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}

// Usolet hash = hashSHA256("Hello, Swift!")print("SHA-256: \\(hash)")// Saída: 8e3a... (64 caracteres)


Exemplo com CommonCrypto (MD5, obsoleto)

Nota: MD5 não é recomendado para segurança, mas pode ser usado para controle de integridade.

import CommonCrypto

func md5Hash(_ input: String) -> String { let data = Data(input.utf8) var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) data.withUnsafeBytes { bytes in _ = CC_MD5(bytes.baseAddress, CC_LONG(data.count), &digest) } return digest.map { String(format: "%02x", $0) }.joined()}


2. Criptografia simétrica (AES-GCM)

A criptografia simétrica usa uma única chave para criptografar e descriptografar. O CryptoKit fornece uma implementação segura de AES-GCM (Galois/Counter Mode).



Exemplo de criptografia e descriptografia com CryptoKit

import CryptoKit

func encryptAESGCM(plaintext: String, key: SymmetricKey) throws -> Data { let plaintextData = Data(plaintext.utf8) let sealedBox = try AES.GCM.seal(plaintextData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}

func decryptAESGCM(ciphertext: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: ciphertext) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}

// Usolet key = SymmetricKey(size: .bits256) // Chave de 256 bitslet encrypted = try encryptAESGCM(plaintext: "Mensagem secreta", key: key)let decrypted = try decryptAESGCM(ciphertext: encrypted, key: key)print("Descriptografado: \\(decrypted)")


3. Criptografia assimétrica (RSA)

A criptografia assimétrica usa um par de chaves: pública (para criptografar) e privada (para descriptografar). No iOS/macOS, para trabalhar com RSA, usa-se Security.framework e SecKey.



Exemplo de geração de chaves e criptografia RSA

import Security

func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false], kSecPublicKeyAttrs as String: [kSecAttrIsPermanent as String: false] ] guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, nil) else { return nil } let publicKey = SecKeyCopyPublicKey(privateKey)! return (privateKey, publicKey)}

func encryptRSA(plaintext: String, publicKey: SecKey) -> Data? { let plaintextData = Data(plaintext.utf8) var error: Unmanaged<CFError>? guard let ciphertext = SecKeyCreateEncryptedData( publicKey, .rsaEncryptionPKCS1, plaintextData as CFData,

Recommendations