Cryptographie en Swift : chiffrement et hachage pour iOS/macOS

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Cryptographie en Swift (iOS/macOS) : chiffrement et hachage



La sécurité des données est un aspect clé du développement pour iOS et macOS. Swift fournit des outils puissants pour la protection cryptographique : du framework intégré CryptoKit (depuis iOS 13 / macOS 10.15) à la bibliothèque bas niveau CommonCrypto (bibliothèque C). Dans cet article, nous aborderons les opérations principales : le chiffrement symétrique (AES), asymétrique (RSA), le hachage (SHA-256) et l'authentification des messages (HMAC).



1. Configuration du projet



Pour utiliser CryptoKit, aucune configuration supplémentaire n'est nécessaire — il fait partie de la bibliothèque standard Foundation. Si vous travaillez avec CommonCrypto, ajoutez-le dans le Bridging-Header (pour Swift + ObjC) ou importez le module directement :



// Pour CommonCrypto dans Swift 5+, vous pouvez utiliser :import CommonCrypto// Ou configurer un pont modulaire (modulemap)


2. Chiffrement symétrique (AES-GCM) avec CryptoKit



CryptoKit fournit une API de haut niveau pour AES en mode GCM (Galois/Counter Mode) — une méthode de chiffrement sécurisée et simple.



import CryptoKitimport Foundation

// Fonction de chiffrement d'une chaînefunc 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}

// Fonction de déchiffrementfunc 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)!}

// Exemple d'utilisationlet key = SymmetricKey(size: .bits256) // Clé de 256 bitslet original = "Message secret pour iOS"let encrypted = try encryptString(original, using: key)print("Chiffré : \\(encrypted.base64EncodedString())")

let decrypted = try decryptData(encrypted, using: key)print("Déchiffré : \\(decrypted)")


Important : SymmetricKey est généré aléatoirement. Pour une application réelle, la clé doit être stockée dans le Keychain ou utiliser Secure Enclave.



3. Hachage (SHA-256) et HMAC



Le hachage est une fonction unidirectionnelle, indispensable pour vérifier l'intégrité des données et stocker les mots de passe. CryptoKit prend en charge 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()}

// Exemple pour une chaînelet message = "Bonjour, Swift Crypto !"let hash = sha256Hash(of: message.data(using: .utf8)!)print("SHA-256 : \\(hash)")


Pour l'authentification des messages (HMAC), utilisez HMAC avec une clé :



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: "Données importantes".data(using: .utf8)!)print("HMAC : \\(hmacResult.base64EncodedString())")


4. Chiffrement asymétrique (RSA) via le framework Security



Pour RSA, utilisez le framework Security (SecKey). CryptoKit ne prend pas en charge RSA directement, mais vous pouvez combiner les approches.



import Security

// Génération d'une paire de clés RSA (2048 bits)func generateRSAKeyPair() -> (privateKey: SecKey, publicKey: SecKey)? { let attributes: [String: Any] = [ kSecAttrKeyType as String: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits as String: 2048, kS

Recommendations