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, Aussi dans la bibliothèque
Génération de PDF en Java : aperçu des meilleures bibliothèques (iText, Apache PDFBox, OpenPDF)
Surveillance des applications Go (Golang) : bibliothèques et outils
Travailler avec CSV en JavaScript (Node.js) : bibliothèques, parsing et génération de données
Bibliothèques GraphQL Kotlin : aperçu complet pour les développeurs backend
Travail avec les dates en Swift (iOS/macOS) : bibliothèques et frameworks