Qu'est-ce que CryptoKit et pourquoi l'utiliser ?
CryptoKit est un framework de cryptographie développé par Apple, intégré nativement dans l'écosystème Swift. Disponible depuis iOS 13, macOS 10.15, watchOS 6 et tvOS 13, il offre une alternative performante et sécurisée aux bibliothèques tierces. Contrairement à ces dernières, CryptoKit est une solution native garantissant une intégration optimale avec le système de gestion de clés Secure Enclave.
Pourquoi adopter CryptoKit ? Dans le développement d'applications modernes, la sécurité des données est primordiale. CryptoKit offre aux développeurs une interface simple mais puissante pour :
- Le hachage de données (SHA-256, SHA-384, SHA-512)
- Le chiffrement symétrique (AES-GCM, ChaCha20-Poly1305)
- Le chiffrement asymétrique (Curve25519, P-256, P-384, P-521)
- Les signatures numériques (EdDSA, ECDSA)
- La génération de nombres aléatoires cryptographiquement sûrs
- L'échange de clés (Diffie-Hellman sur courbes elliptiques)
Le framework est conçu pour minimiser les erreurs de développement : il utilise des implémentations sécurisées par défaut, gère automatiquement la mémoire et empêche l'utilisation d'algorithmes obsolètes ou non sécurisés (comme MD5 ou SHA-1 pour les signatures).
Installation de CryptoKit
Étant donné que CryptoKit fait partie de la bibliothèque standard d'Apple, aucune installation via des gestionnaires de paquets (CocoaPods, Swift Package Manager ou Carthage) n'est nécessaire. Il vous suffit d'un projet avec un déploiement minimum iOS 13+ ou macOS 10.15+.
Important : Si vous développez pour des versions antérieures du système d'exploitation, CryptoKit n'est pas disponible. Dans ce cas, utilisez CommonCrypto (niveau C) ou des bibliothèques tierces (comme CryptoSwift).
Pour vérifier la disponibilité de CryptoKit dans votre code :
import CryptoKit
if #available(iOS 13.0, macOS 10.15, *) {
// Votre code avec CryptoKit
} else {
// Solution de repli avec CommonCrypto
}
Démarrage rapide avec un exemple de code
Voici un exemple simple : le hachage d'une chaîne et le chiffrement symétrique.
import CryptoKit
import Foundation
// 1. Hachage
let inputString = "Bonjour, CryptoKit !"
let inputData = Data(inputString.utf8)
let hash = SHA256.hash(data: inputData)
print("Hash SHA256 : \(hash.compactMap { String(format: "%02x", $0) }.joined())")
// 2. Chiffrement symétrique (AES-GCM)
let key = SymmetricKey(size: .bits256) // Génération d'une clé 256 bits
let plaintext = "Message secret".data(using: .utf8)!
do {
let sealedBox = try AES.GCM.seal(plaintext, using: key)
print("Données chiffrées : \(sealedBox.ciphertext.base64EncodedString())")
// Déchiffrement
let openedBox = try AES.GCM.open(sealedBox, using: key)
let decryptedString = String(data: openedBox, encoding: .utf8)!
print("Message déchiffré : \(decryptedString)")
} catch {
print("Erreur de chiffrement : \(error)")
}
Méthodes et fonctions principales de CryptoKit
Voici 10 fonctions clés de CryptoKit avec descriptions détaillées, paramètres et exemples.
1. SHA256.hash(data:)
Description : Calcule le hash SHA-256 des données fournies. Retourne un objet SHA256Digest.
Paramètres :
data: Data— les données d'origine à hacher.
Exemple :
let data = "Exemple de données".data(using: .utf8)!
let digest = SHA256.hash(data: data)
print(digest.description) // Affiche : SHA256 digest: 8f4343... (64 caractères)
2. SHA384.hash(data:)
Description : Similaire à SHA256, mais utilise un digest de 384 bits. Plus sécurisé, mais plus lent.
Paramètres : identiques à SHA256.
Exemple :
let digest384 = SHA384.hash(data: data)
print(digest384.description)
3. SHA512.hash(data:)
Description : Calcule le hash SHA-512 (512 bits). Le plus sécurisé de la famille SHA-2.
Exemple :
let digest512 = SHA512.hash(data: data)
print(digest512.description)
4. HMAC avec SHA256
Description : Calcule un code d'authentification de message basé sur un hash (HMAC) en utilisant SHA256.
Exemple :
let keyHMAC = SymmetricKey(size: .bits256)
let code = HMAC.authenticationCode(for: data, using: keyHMAC)
print("Code HMAC : \(code.compactMap { String(format: "%02x", $0) }.joined())")
5. AES.GCM.seal(_:using:)
Description : Chiffre les données avec AES en mode GCM (Galois/Counter Mode). Retourne un AES.GCM.SealedBox contenant le texte chiffré et un tag d'authentification.
Paramètres :
plaintext: Data— données à chiffrer.using: SymmetricKey— clé symétrique (128 ou 256 bits).
Exemple :
let sealedBox = try AES.GCM.seal(plaintext, using: key)
print("Données chiffrées : \(sealedBox.ciphertext.base64EncodedString())")
6. AES.GCM.open(_:using:)
Description : Déchiffre les données précédemment chiffrées avec AES-GCM. Vérifie l'intégrité via le tag d'authentification.
Exemple :
let decryptedData = try AES.GCM.open(sealedBox, using: key)
let decryptedString = String(data: decryptedData, encoding: .utf8)!
print("Message déchiffré : \(decryptedString)")
7. ChaChaPoly.seal(_:using:)
Description : Chiffre les données avec ChaCha20-Poly1305, une alternative rapide et sécurisée à AES-GCM.
Exemple :
let chachaBox = try ChaChaPoly.seal(plaintext, using: key)
print("Données chiffrées avec ChaCha20 : \(chachaBox.ciphertext.base64EncodedString())")
8. Curve25519.KeyAgreement.privateKey
Description : Génère une clé privée pour l'échange de clés Diffie-Hellman sur Curve25519.
Exemple :
let privateKey = Curve25519.KeyAgreement.PrivateKey()
let publicKey = privateKey.publicKey
print("Clé publique : \(publicKey.rawRepresentation.base64EncodedString())")
9. P256.Signing.privateKey
Description : Génère une clé privée pour les signatures numériques ECDSA sur la courbe P-256.
Exemple :
let signingKey = P256.Signing.PrivateKey()
let signature = try signingKey.signature(for: data)
print("Signature : \(signature.rawRepresentation.base64EncodedString())")
10. SecureEnclave (intégration)
Description : CryptoKit s'intègre avec Secure Enclave pour stocker les clés privées de manière sécurisée. Utilisez SecureEnclave.P256.Signing.PrivateKey() pour générer une clé protégée.
Exemple :
if SecureEnclave.isAvailable {
let secureKey = try SecureEnclave.P256.Signing.PrivateKey()
print("Clé stockée dans Secure Enclave")
} else {
print("Secure Enclave non disponible")
}
Bonnes pratiques avec CryptoKit
- Utilisez toujours des clés de taille suffisante : 256 bits pour AES, 256 bits pour Curve25519.
- Ne stockez jamais les clés en clair dans le code : utilisez le Keychain ou Secure Enclave.
- Préférez AES-GCM ou ChaCha20-Poly1305 pour le chiffrement symétrique : ils offrent à la fois confidentialité et intégrité.
- Évitez les algorithmes obsolètes : CryptoKit ne les propose pas, mais soyez vigilant avec vos propres implémentations.
- Testez vos flux de chiffrement/déchiffrement avec des données de test variées.
Conclusion
CryptoKit est un framework puissant et sécurisé pour toutes vos opérations cryptographiques en Swift. Que vous développiez une application iOS, macOS, watchOS ou tvOS, il vous offre une API moderne et intuitive. Grâce à son intégration native avec l'écosystème Apple, vous bénéficiez de performances optimales et d'une sécurité renforcée. Commencez dès aujourd'hui à sécuriser vos applications avec CryptoKit !