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

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



Dans le développement moderne pour iOS et macOS, la sécurité des données est un aspect critique. Swift offre des outils intégrés puissants pour la cryptographie, allant de l'API bas niveau CommonCrypto (C-API) au framework moderne CryptoKit (iOS 13+/macOS 10.15+). Dans cet article, nous allons passer en revue les principales méthodes de chiffrement et de hachage disponibles pour le développeur Swift.



1. Hachage (Hashing)

Le hachage est une transformation unidirectionnelle de données en une chaîne de longueur fixe. Il est utilisé pour vérifier l'intégrité des données et stocker les mots de passe (avec du sel).



Exemple avec 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()}

// Utilisationlet hash = hashSHA256("Hello, Swift!")print("SHA-256: \\(hash)")// Sortie : 8e3a... (64 caractères)


Exemple avec CommonCrypto (MD5, obsolète)

Remarque : MD5 n'est pas recommandé pour la sécurité, mais peut être utilisé pour le contrôle d'intégrité.

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. Chiffrement symétrique (AES-GCM)

Le chiffrement symétrique utilise une seule clé pour chiffrer et déchiffrer. CryptoKit fournit une implémentation sécurisée d'AES-GCM (Galois/Counter Mode).



Exemple de chiffrement et déchiffrement avec 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)!}

// Utilisationlet key = SymmetricKey(size: .bits256) // clé 256 bitslet encrypted = try encryptAESGCM(plaintext: "Message secret", key: key)let decrypted = try decryptAESGCM(ciphertext: encrypted, key: key)print("Déchiffré : \\(decrypted)")


3. Chiffrement asymétrique (RSA)

Le chiffrement asymétrique utilise une paire de clés : une clé publique (pour le chiffrement) et une clé privée (pour le déchiffrement). Sous iOS/macOS, on utilise Security.framework et SecKey pour travailler avec RSA.



Exemple de génération de clés et de chiffrement 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