Analyse du code de la classe ChannelManager (Exemple CNG)
Dans l'exemple de communication sécurisée CNG (Cryptography Next Generation), la classe ChannelManager fournit l'infrastructure de communication entre processus (IPC) pour l'exemple.
La classe est responsable de :
la création, l'ouverture, la fermeture et la suppression des canaux nommés ;
l'envoi et la réception d'indicateurs de contrôle d'application, de noms de canal, de signatures numériques, de clés de chiffrement et de messages.
Consultez Communication sécurisée Cryptography Next Generation (CNG), exemple pour obtenir une vue d'ensemble de l'exemple et des descriptions des versions mentionnées dans cette rubrique.
Contenu du fichier ChannelManager.cs
Le fichier ChannelManager.cs contient les classes et méthodes suivantes :
Classe ChannelManager :
Constructeur : crée un canal nommé, puis attend une connexion à l'autre extrémité du canal.Si le canal nommé est serveur de canaux, il attend une connexion client en appelant la méthode WaitForConnection.Si le canal nommé est un client du canal, il attend un serveur de canaux nommé en appelant la méthode Connect.Le constructeur ChannelManager n'est pas retourné tant que la connexion n'est pas établie.
Méthode Dispose : implémente l'interface System.IDisposable en libérant ses ressources instanciées (Stream m_Stream) lorsque la classe est hors de portée.
Méthode ReadMessage : reçoit des messages des clients du canal.
Méthode SendMessage : envoie des messages aux clients du canal.
Méthode AppControl : utilisée par Alice pour envoyer des indicateurs de contrôle d'application à Bob et Mallory.Ces indicateurs synchronisent les états Version, fMallory et fVerbose entre les trois fenêtres Commande.AppControl n'est pas impliqué dans le chiffrement ou la transmission de messages.Il s'agit strictement d'un mécanisme de contrôle interapplication.Cette méthode crée un objet ChannelManager temporaire qui est supprimé après utilisation.
Méthode SendChannelName : méthode pratique qui gère l'envoi du nom d'un nouveau canal à un client.Cette méthode crée un objet ChannelManager temporaire qui est supprimé après utilisation.
Méthode ReceiveChannelName : méthode pratique qui gère la réception du nom d'un nouveau canal envoyé par un serveur.Cette méthode crée un objet ChannelManager temporaire qui est supprimé après utilisation.
Détails de classe ChannelManager
Les applications Alice, Bob et Mallory sont connectées par les canaux nommés créés par les instances ChannelManager.Chaque application crée et supprime deux types d'objets ChannelManager :
Objets à long terme : Alice et Bob créent tous les deux un objet ChannelManager à long terme au démarrage de leurs méthodes Run.Ils utilisent cet objet pour transmettre des contacts commerciaux.Mallory crée deux objets ChannelManager à long terme dans sa méthode Run : un pour communiquer avec Alice et un pour communiquer avec Bob.Les canaux sont utilisés pour échanger des clés de chiffrement et des messages chiffrés.Ils sont conservés jusqu'à la fin de la méthode Run, puis sont supprimés.
Objets temporaires : les méthodes AppControl, SendChannelName et ReceiveChannelName créent des objets ChannelManager temporaires pour effectuer une tâche spécifique.Les objets sont ensuite supprimés.Dans les versions 4 et 5, Alice envoie une clé de signature numérique privée à Bob à l'aide d'un objet ChannelManager temporaire.
La classe ChannelManager implémente l'interface System.IDisposable et gère les modes de transmission send et receive.
La classe donne l'illusion d'un échange dynamique entre Alice, Bob et Mallory.En réalité, un canal ne peut exister que dans un mode à la fois. Il peut s'agir d'un serveur ou d'un client.Les applications Alice, Bob et Mallory s'exécutent donc de façon prudente et linéaire.Chaque application attend que les canaux s'ouvrent et se ferment à des moments donnés pendant l'exécution de l'exemple.La communication n'est pas asynchrone, bien qu'elle semble l'être.
Un gestionnaire de threads peut sembler gérer des threads en arrière-plan. Cependant, aucun appel de threading n'est utilisé.Le minutage entre processus est obtenu uniquement via un entrelacement prudent des appels send et receive entre Alice, Bob et Mallory.Par conséquent, les trois fenêtres semblent communiquer facilement, suivant le scénario décrit dans la section Vue d'ensemble de l'exemple CNG.
L'un des avantages de cette implémentation est la synchronisation. Le code est également simple et linéaire.L'un des inconvénients est le manque de solidité : si un client du canal ne parvient pas à se connecter au serveur, le serveur cesse de répondre.Une solution efficace consisterait à 'utiliser un serveur de canaux multithread capable de gérer de telles défaillances.Toutefois, pour des raisons de simplicité, l'exemple ne traite pas cette solution.
La classe ChannelManager est instanciée à partir des méthodes Main d'Alice, Bob et Mallory et du constructeur de classe Communicator dans le fichier Communicator.cs.
Détails d'utilisation
La classe ChannelManager est utilisée dans cinq contextes différents : le contrôle d'application, la transmission de nom de canal, la transmission de messages, la transmission de clés de signature numérique et la transmission de clés de chiffrement publiques.Ces contextes sont décrits dans la liste suivante selon leur ordre d'apparition dans le code source.
Contrôle d'application : Alice appelle la méthode InitializeOptions au début de sa méthode Main et reçoit des options de session de l'utilisateur.Ces options (Version, fMallory et fVerbose) sont ensuite envoyées à Bob et Mallory par la méthode AppControl.Si l'utilisateur décide de fermer l'application en tapant la lettre « x », la méthode AppControl envoie la chaîne « exit » au lieu des options de session à Bob et Mallory.
La méthode AppControl d'Alice crée deux serveurs de canaux ChannelManager temporaires, BobControlChannel et MalloryControlChannel.
Les méthodes AppControl de Bob et Mallory créent des clients de canal ChannelManager temporaires et se connectent à leurs canaux de contrôle respectifs.
Bob et Mallory reçoivent les options de session d'Alice et suppriment immédiatement les objets ChannelManager temporaires.
Transmission de nom de canal : après avoir transmis les options de session, Alice envoie le nom d'un nouveau canal à Bob.
Alice utilise la méthode SendChannelName tandis que Bob et Mallory utilisent la méthode ReceiveChannelName.Chaque méthode crée un serveur de canaux ou un client ChannelManager temporaire.Après l'envoi ou la réception du nom du nouveau canal, l'instance ChannelManager temporaire est supprimée.
Le défaut de sécurité se produit lorsque Mallory intercepte le nom du nouveau canal en appelant ReceiveChannelName 200 millisecondes avant Bob.Pour en savoir plus sur ce défaut de sécurité, consultez Implémentation d'une attaque de l'intercepteur (« Man-in-the-Middle ») (Exemple CNG).
Transmission de messages : après avoir transmis les options de session et le nom du nouveau canal, Alice, Bob et Mallory créent des objets Communicator.Les constructeurs Communicator reçoivent le nom du nouveau canal envoyé lors de l'étape précédente et l'utilisent pour créer des instances ChannelManager à long terme.Ces objets sont les seules instances ChannelManager non temporaires.Ils sont conservés jusqu'à la transmission et la réception du dernier message, puis sont supprimés.
Notes
L'objet ChannelManager créé par Alice encapsule un serveur de canaux nommé AliceAndBobChannel.Toutefois, Mallory intercepte ce nom et envoie un autre nom de canal (AliceAndBobChannel1) à Bob.Bob passe cette chaîne comme paramètre name à son constructeur Communicator, créant ainsi un client de canal nommé AliceAndBobChannel1.Ce changement de nom permet à Mallory d'emprunter l'identité d'Alice dans les messages qu'elle adresse à Bob.
Transmission de clés de signature numérique : une fois qu'Alice a créé son objet Communicator, l'indicateur Version est analysé.Dans la version 3, elle envoie une clé de signature numérique à Bob via le canal nommé PublicChannel, où elle est interceptée par Mallory.Dans les versions 4 et 5, elle crée une instance ChannelManager secrète temporaire.Cette instance est ensuite utilisée pour transmettre une clé de signature numérique privée à Bob.
Notes
Mallory ne connaît pas ce canal nommé privé puisqu'il ne dispose pas de la version 4 ou 5 du logiciel de messagerie instantanée.Alice continue à utiliser l'objet ChannelManager de messagerie à long terme créé lors de l'étape 3 pour envoyer une fausse signature numérique à Bob.Dans les versions 4 et 5, l'outil messagerie instantanée de Bob a été mis à jour pour ignorer cet objet.Toutefois, Mallory pense que la signature est valide et l'utilise pour signer ses clés de chiffrement et ses messages.Cela entraîne sa chute.
Transmission de clés de chiffrement publiques : l'indicateur Version est de nouveau analysé.Dans la version 2 et les versions ultérieures, l'objet ChannelManager de messagerie à long terme créé lors de l'étape 3 est utilisé pour envoyer et recevoir des clés de chiffrement publiques.
Après avoir échangé les noms de canal, les signatures numériques et les clés de chiffrement, Alice et Bob utilisent le ChannelManager créé lors de l'étape 3 pour transmettre des messages.
Voir aussi
Référence
Concepts
Communication sécurisée Cryptography Next Generation (CNG), exemple