PC & Mobile

Opérations cryptographiques courantes dans Swift avec CryptoKit

Opérations cryptographiques courantes dans Swift avec CryptoKit


CryptoKit d’Apple est une nouvelle bibliothèque (disponible à partir de l’été 19) disponible à partir d’iOS 13 et plus, qui effectue les opérations de chiffrement de manière sécurisée et efficace. Ses caractéristiques comprennent:

  • Une (belle) API Swift.
  • Accès aux fonctions cryptographiques.
  • Facilité d'utilisation pour des fonctions faciles à utiliser.
  • Une amélioration par rapport aux systèmes existants.

Solutions de cryptographie existantes sur iOS

Il existe deux solutions populaires, de confiance et open-source. Le premier est OpenSSL (official) qui est une bibliothèque C open source que vous pouvez relier statiquement à votre application au prix d’une augmentation de sa taille. Le second est CommonCrypto (officiel et source), qui est également une bibliothèque C open source utilisée dans vos applications en tant que cadre lié de manière dynamique (la taille de votre application n’augmente donc pas).

Si vous utilisez la première solution, la taille de votre application sera gonflée de plusieurs mégaoctets. Si vous utilisez la deuxième solution, vous risquez d'être exposé à une attaque par échange de bibliothèque. Un attaquant peut remplacer votre copie par la leur (également possible, mais plus difficile). dans le premier cas).

Ces deux systèmes sont des systèmes de niveau inférieur et, quel que soit votre choix, vous devez gérer des pointeurs bruts et une gestion de mémoire explicite. CryptoKit libère votre application de cette situation en fournissant une API rapide de haut niveau qui écrase également les données sensibles lors de la désallocation de la mémoire.

Quand utiliser la cryptographie dans vos applications

Il est possible que vous souhaitiez utiliser la cryptographie dans vos applications pour plusieurs raisons. Vous voulez peut-être protéger quelque chose ou peut-être garder quelque chose de secret.

  • Vous voudrez peut-être appliquer le protection de vos utilisateurs ou des données de votre organisation en gardant des informations sensibles inaccessibles à quiconque sans accès explicite; informations de transaction et de compte dans une application bancaire, par exemple.
  • Vous pouvez également vouloir maintenir le confidentialité de communication entre pairs dans une application de chat ou de courrier électronique.
  • Enfin, vous voudrez peut-être protéger et fournir authentification de l'origine de certaines informations; Par exemple, si vous effectuez une validation de réception sur des achats intégrés.

Vous pouvez donc voir que les applications sont assez larges et variées et qu’elles pourraient s’appliquer à votre propre cas d’utilisation.

Remarque: n'utilisez jamais une version non approuvée d'OpenSSL. Il suffit de télécharger la bibliothèque à partir d’une source fiable (par exemple, https://www.openssl.org/source/) et double-cocher le hash de téléchargement.

Remarque 2: Il est à noter que vous auriez pu créer votre propre crypto, ce que je ne peux malheureusement pas vous recommander. C’est une tâche monumentale avec tant de choses qui pourraient mal tourner (défendre contre attaques de l'homme du milieu, attaques d'anniversaire, attaques clés connues, etc.). Vous devriez plutôt envisager de contribuer à un projet existant. Si vous êtes un cryptographe, vous avez choisi de suivre cette voie, mais bon pour vous

Nous allons passer en revue certains des cas les plus courants couverts par CryptoKit. Ceux-ci sont:

  • Hachage
  • Cryptage et décryptage des données
  • Création et vérification de signatures
  • Authentification des données
  • Accomplir l'accord de clé

Hachage des données

UNE fonction de hachage est une fonction qui peut être utilisée pour mapper des données de taille arbitraire à des valeurs de taille fixe. Cela signifie qu'une fonction de hachage prend une entrée et la transforme en une sortie (un hachage ou un condensé) qui représente cette entrée. Cette valeur de hachage est pratiquement unique.

Image reproduite avec l'aimable autorisation de Wikipedia https://en.wikipedia.org/wiki/Cryptographic_hash_function

Vous pouvez utiliser le hachage sur n'importe quelle donnée en tant qu'entrée. Celles-ci peuvent être, mais sans s'y limiter, des données brutes, des fichiers, des images, du son ou de la vidéo Vous pouvez par exemple hacher le contenu d'un fichier vidéo et l'envoyer à un récepteur avec le fichier vidéo réel. Le destinataire peut exécuter la même fonction de hachage sur les données de son côté pour voir si le même résumé est produit. Si ce n’est pas le cas, le fichier a été falsifié ou n’est pas le même fichier que celui qui a été transmis à l’origine.

Voici comment hacher un fichier vidéo:

importer CryptoKitFondation d'importationlet path = Bundle.main.path (forResource: "video", ofType: "mp4")!let data = FileManager.default.contents (atPath: path)!let digest = SHA256.hash (data: data)imprimer (digérer)

Parfois, le fichier peut être trop volumineux pour être chargé et stocké dans la mémoire. Dans ce cas, vous pouvez utiliser des flux rapides pour obtenir un résumé:

var hasher = SHA256 ()let path = Bundle.main.path (forResource: "video", ofType: "mp4")!let stream = InputStream (fileAtPath: path)! stream.open ()let bufferSize = 512let buffer = UnsafeMutablePointer
.allocate (capacité: bufferSize)
while stream.hasBytesAvailable { let read = stream.read (buffer, maxLength: bufferSize) let bufferPointer = UnsafeRawBufferPointer (démarrage: tampon, compter: lire) hasher.update (bufferPointer: bufferPointer)}laissez digérer = hasher.finalize ()imprimer (digérer)

Cryptage et décryptage des données

Dans la méthode de sécurité du chiffrement des données, les informations sont codées de manière à ne pouvoir être consultées qu’avec la clé de chiffrement correcte détenue par une partie autorisée. Si la clé de cryptage est incorrecte ou manquante, il est impossible d'accéder aux données et semble aléatoire et illisible.

Vous pouvez chiffrer le contenu d'un message super secret que vous souhaitez envoyer à quelqu'un. En supposant que les deux et que vous avez tous les deux la clé qui a été utilisée pour chiffrer le message, vous êtes tous les deux les seuls à pouvoir lire les messages échangés entre vous. Ainsi:

let key = SymmetricKey (taille: .bits256)let path = Bundle.main.path (forResource: "video", ofType: "mp4")!let data = FileManager.default.contents (atPath: path)!// Crypterlaissez encryptedData = essayer! ChaChaPoly.seal (données, utilisation de: clé)// déchiffrerlaissez sealedBox = essayer! ChaChaPoly.SealedBox (combiné: encryptedData)laissez decryptedData = essayer! ChaChaPoly.open (sealedBox, en utilisant: key)

ChaChaPoly est une implémentation du chiffrement ChaCha20-Poly1305 au cas où vous vous poseriez la question.

Création et vérification de signatures

Une signature numérique en cryptographie est un schéma mathématique permettant de vérifier l'authenticité d'informations numériques telles que des messages ou des documents. Une signature dont la validité a été confirmée par un destinataire indique clairement que l’information a bien été créée par la personne qui prétend l’avoir créée et qu’elle n’a pas été falsifiée.

Image reproduite avec l'aimable autorisation de Wikipedia https://en.wikipedia.org/wiki/Digital_signature

C’est simple de signer des données avec CryptoKit:

let privateKey = Curve25519.Signing.PrivateKey ()let publicKey = privateKey.publicKey // publie librementlet publicKeyData = publicKey.rawRepresentationlaisser signaturePublicKey = essayer! Curve25519.Signing.PublicKey (rawRepresentation: publicKeyData)// signe des données avec ta clé privéelet data = "Toutes vos bases nous appartiennent" .data (using: .utf8)!laissez signature = essayer! privateKey.signature (pour: data)si signaturePublicKey.isValidSignature (signature, pour: données) {        print ("La signature est valide.")}

Authentification des données

En authentification de données, l’objectif est de vérifier l’identité d’un utilisateur. Un cas courant dans lequel cela nous intéresserait serait lorsqu'un utilisateur demande d'envoyer des données à un serveur que nous contrôlons mais que nous voudrions qu'il vérifie son identité avant de le lui permettre.

let path = Bundle.main.path (forResource: "video", ofType: "mp4")!let data = FileManager.default.contents (atPath: path)!let key = SymmetricKey (size: .bits256) // clé partagée par les deux partieslaisser l'authentification = HMAC
.authenticationCode (pour: data,
en utilisant: clé)let authenticationData = Données (authentification)
// ~~~~~~ voyager à travers le réseau ~~~~~~~
si (HMAC.isValidAuthenticationCode (authenticationData, authentification: données, en utilisant: clé)) { print ("Validé")}

Accomplir l'accord de clé

En cryptographie, un protocole d'accord clé est un processus au cours duquel deux parties, chacune avec sa propre clé privée, établissent un secret partagé entre elles.

Image reproduite avec l'aimable autorisation de Wikipedia https://en.wikipedia.org/wiki/Alice_and_Bob

Cela leur permet de chiffrer ou de signer les données qu'ils souhaitent échanger. En outre, ce protocole, une fois exécuté, empêche les tiers non autorisés d’écouter. Voyons comment:

let salt = "Salt" .data (en utilisant: .utf8)!
let firstPrivateKey = P256.KeyAgreement.PrivateKey ()let firstPublicKey = firstPrivateKey.publicKeylaissez secondPrivateKey = P256.KeyAgreement.PrivateKey ()laisser secondPublicKey = secondPrivateKey.publicKeylaisser firstSharedSecret = essayer! firstPrivateKey.sharedSecretFromKeyAgreement (avec: secondPublicKey)let firstSymmetricKey = firstSharedSecret.hkdfDerivedSymmetricKey (avec: SHA256.self, sel: sel, sharedInfo: Data (), outputByteCount: 32)laisser secondSharedSecret = essayer! secondPrivateKey.sharedSecretFromKeyAgreement (avec: firstPublicKey)let secondSymmetricKey = secondSharedSecret.hkdfDerivedSymmetricKey (utilisation de: SHA256.self, sel: sel, sharedInfo: Data (), outputByteCount: 32)si firstSymmetricKey == secondSymmetricKey { print ("Les premier et deuxième ont la même clé pour faire ce qu'ils veulent")}

Jusqu'ici, nous avons exploré cinq cas différents en utilisant CrypoKit, mais il y en a beaucoup d'autres (le gestionnaire de clés basé sur le matériel nous vient à l'esprit)! Si vous êtes intéressé et souhaitez en savoir plus, Apple a fourni de nombreux exemples de code dans la documentation, à la fois en tant que terrains de jeu et projets Xcode.

J'espère que vous en apprendrez davantage sur le cryptage avec CryptoKit en lisant ceci. Sa facilité d'utilisation par rapport aux solutions antérieures à iOS 13 le rend certainement plus attrayant à long terme et aidera sans doute beaucoup plus de développeurs à rendre leurs applications plus sécurisées.

Afficher plus

SupportIvy

SupportIvy.com : Un lieu pour partager le savoir et mieux comprendre le monde. Meilleure plate-forme de support gratuit pour vous, Documentation &Tutoriels par les experts.

Articles similaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page
Fermer