Cryptographie en Swift (iOS/macOS) : chiffrement et hachage
Dans le développement moderne pour iOS et macOS, la sécurité des données est l'une des priorités clés. Apple fournit des outils intégrés puissants pour la protection cryptographique : du simple hachage au chiffrement asymétrique. Dans cet article, nous allons voir comment utiliser CryptoKit (framework recommandé depuis iOS 13 / macOS 10.15) et le classique CommonCrypto pour résoudre des tâches typiques : chiffrement, hachage et authentification des données.
Concepts de base
Avant de passer au code, clarifions les termes :
- Chiffrement symétrique — une seule clé est utilisée pour le chiffrement et le déchiffrement (par exemple, AES).
- Chiffrement asymétrique — une paire de clés : une publique (pour le chiffrement) et une privée (pour le déchiffrement).
- Hachage — transformation irréversible des données en une chaîne de longueur fixe (SHA-256).
- HMAC — code d'authentification de message basé sur un hachage avec utilisation d'une clé.
1. Hachage avec CryptoKit
CryptoKit est un framework Swift moderne qui rend la cryptographie simple et sécurisée. Pour le hachage, on utilise la structure SHA256.
import CryptoKit
func hashString(_ input: String) -> String { let inputData = Data(input.utf8) let hashed = SHA256.hash(data: inputData) return hashed.compactMap { String(format: "%02x", $0) }.joined()}
// Exemple d'utilisationlet password = "MySecurePass123"let hash = hashString(password)print("SHA-256 hash : \\(hash)")Également disponibles : SHA384, SHA512 et SHA1 (ce dernier uniquement pour compatibilité).
2. HMAC (authentification de message)
HMAC ajoute une clé au hachage, ce qui protège contre la falsification. Dans CryptoKit, cela est implémenté via HMAC avec spécification de l'algorithme :
import CryptoKit
func hmacSHA256(key: SymmetricKey, message: String) -> String { let messageData = Data(message.utf8) let code = HMAC<SHA256>.authenticationCode(for: messageData, using: key) return code.compactMap { String(format: "%02x", $0) }.joined()}
// Génération de la clélet key = SymmetricKey(size: .bits256)let hmac = hmacSHA256(key: key, message: "Message important")print("HMAC : \\(hmac)")3. Chiffrement symétrique (AES-GCM)
AES-GCM est un mode de chiffrement moderne qui assure à la fois la confidentialité et l'authentification (empêche la falsification des données). CryptoKit le prend en charge nativement.
import CryptoKit
func encryptAESGCM(plainText: String, key: SymmetricKey) throws -> Data { let plainData = Data(plainText.utf8) let sealedBox = try AES.GCM.seal(plainData, using: key) return sealedBox.combined! // combined = nonce + ciphertext + tag}
func decryptAESGCM(encryptedData: Data, key: SymmetricKey) throws -> String { let sealedBox = try AES.GCM.SealedBox(combined: encryptedData) let decryptedData = try AES.GCM.open(sealedBox, using: key) return String(data: decryptedData, encoding: .utf8)!}
// Exemplelet key = SymmetricKey(size: .bits256)let originalText = "Données secrètes"
do { let encrypted = try encryptAESGCM(plainText: originalText, key: key) let decrypted = try decryptAESGCM(encryptedData: encrypted, key: key) print("Déchiffré : \\(decrypted)")} catch { print("Erreur : \\(error)")}Important : combined inclut tout le nécessaire pour le déchiffrement (nonce, ciphertext, tag). Conservez-le avec les données chiffrées.
4. Chiffrement asymétrique (RSA) via CommonCrypto
Pour RSA, CryptoKit ne fournit pas d'API directe, mais on peut utiliser Security.framework et CommonCrypto
Aussi dans la bibliothèque
Travailler avec YAML en Kotlin : bibliothèques, exemples et parsing
Travailler avec Excel en Java : Apache POI et alternatives
Client OAuth pour Java : aperçu des bibliothèques et exemples de code
Génération Swagger/OpenAPI pour Rust : Utoipa et Aide
Cryptographie en C++ : chiffrement et hachage avec OpenSSL et Crypto++