dimanche 5 février 2012

Chiffrement fort pour Cocoa / Cocoa Touch

S'il vous plaît ne pas utiliser ce code! Au lieu de cela, consultez Jim Dovey de Common code Crypto partir AQToolkit.

AES est une norme de cryptage fort qui a surtout remplacé le vieillissement DES standard. AES est un mécanisme de cryptage largement utilisé et assez sûr (mais je ne suis pas un expert à la cryptographie par aucun effort d'imagination, je suis confiante que les experts pour avis). AES soutient trois différentes tailles de clé, 128, 192 et 256 (plus la clé, le plus sécurisé de cryptage et de la puissance de traitement nécessaire pour chiffrer ou déchiffrer). Apple utilise AES-128 et AES-256 à plusieurs endroits dans Mac OS X, notamment pour le chiffrement d'image disque.

Il existe plusieurs implémentations dans le domaine public de l'AES. J'ai choisi un mise en œuvre du domaine public de l'AES par Philip J. Erdelsky à utiliser comme base de certaines catégories d'Objective-C qui font le cryptage et décryptage de fichiers et de données en utilisant AES-256 facile.

La première catégorie est le NSFileManager, et vous permet de crypter un fichier dans le système de fichiers. Il prend un fichier à un chemin particulier, le chiffre en utilisant un mot de passe, puis écrit le contenu chiffré à un emplacement de fichier spécifié nouvelle. Cette version a mémoire supplémentaire relativement faible, car elle flux des données dans des morceaux à la fois pour la lecture et l'écriture, de sorte que le morceau en cours cryptée est en mémoire. La catégorie ajoute deux méthodes pour NSFileManager, une pour le chiffrement, l'autre pour le déchiffrement. Ces méthodes sont le meilleur choix quand votre source de données existe déjà dans le système de fichiers, en particulier sur l'iPhone, en raison de la manière dont il utilise peu de mémoire pour faire le travail. Voici un exemple d'utilisation de la catégorie sur NSFileManager pour crypter un fichier:
    NSError *error = nil; if (![[NSFileManager defaultManager] AESEncryptFile:@"/path/to/input file" toFile:@"/path/to/output file" usingPassphrase:@"My secret password" error:&error]) {            NSLog(@"Failed to write encrypted file. Error = %@", [[error userInfo] objectForKey:AESEncryptionErrorDescriptionKey]); }

Il ya aussi une catégorie sur NSData qui vous permettra de chiffrer un bloc de données qui est déjà en mémoire. Cette version crée un nouvel objet NSData avec le contenu crypté de l'instance originale NSData. Si vos données sont déjà en mémoire, et vous voulez une version cryptée ou décryptée d'elle, alors les méthodes NSData sont la voie à suivre. Voici un exemple d'utilisation de crypter un objet NSData avec AES:
    NSData *encryptedData = [data AESEncryptWithPassphrase:@"My secret password"];

Assez facile, hein? Bon, maintenant, il s'agit d'un chiffre symétrique de bloc, il n'est pas chiffrement à clé publique, donc si vous stockez votre mot de passe comme une chaîne dans votre application (par opposition à faire de l'utilisateur, il entrer ou de le stocker dans le trousseau) alors vous re donner à quelqu'un la possibilité de décrypter vos données cryptées d'application, si juste soit prévenu.

Aussi, je ne donnent aucune garantie sur la façon dont cela est sécurisé. Autant que je sache, AES-256 n'a pas été brisé encore, cependant je ne peux pas dire pour certaint qu'il n'ya pas de faiblesses dans la mise en oeuvre AES que j'ai utilisé. Je ne vois pas de problèmes apparents, mais je ne suis pas un cryptographe. Je n'ai pas entendu parler de faiblesses dans cette mise en œuvre particulière, mais tout usage de ce qui est totalement à vos propres risques.

Voici un fichier zip contenant les deux catégories et la mise en oeuvre AES. Juste ajouter à votre projet Xcode, notamment les en-têtes appropriés, et de chiffrer l'écart.

Oh, et, une chose plus importante: Si vous utilisez ce dans une application iPhone qui vous envisagez de vendre sur l'App Store, il peut allonger le processus de révision, comme vous aurez à déclarer que vous êtes en utilisant le cryptage, et aura probablement pour créer et télécharger une CCATS formulaire et attendre pour Apple de l'examiner avant de votre application va monter pour la vente. Lire l'iTunes Connect Developer Guide pour plus d'informations sur CCATS et le processus avant de décider de l'utiliser dans une application iPhone pour la vente, s'il vous plaît.

UPDATE: Jim Dovey auteur de l'excellent IPhone App sortie, A affiché une catégorie sur NSMutableData dans les commentaires de ce post qui utilise les bibliothèques crypto déjà disponibles sur le Mac et l'iPhone pour faire cryptage AES-256. Selon Jim, cela signifie que vous n'avez pas besoin d'une forme CCATS parce Apple exporter le code de cryptage, pas vous, alors check it out Merci, Jim.

Aucun commentaire: