Condividi tramite


Analisi del codice della classe ChannelManager (esempio CNG)

Nell'esempio di comunicazione protetta tramite Cryptography Next Generation (CNG), la classe ChannelManager fornisce l'infrastruttura di comunicazione interprocesso (IPC) per l'esempio.

La classe viene utilizzata per le operazioni seguenti:

  • Creazione, apertura, chiusura ed eliminazione di named pipe.

  • Invio e ricezione di flag di controllo dell'applicazione, nomi di canale, firme digitali, chiavi di crittografia e messaggi.

Per una panoramica dell'esempio e le descrizioni delle versioni citate in questo argomento, vedere Esempio di comunicazione protetta tramite Cryptography Next Generation (CNG).

Contenuto del file ChannelManager.cs

Il file ChannelManager.cs contiene le classi e i metodi seguenti:

  • Classe ChannelManager:

    • Costruttore: crea una named pipe e quindi rimane in attesa di una connessione all'altra estremità della pipe.Se la named pipe è un server pipe, rimane in attesa di una connessione client chiamando il metodo WaitForConnection.Se la named pipe è un client pipe, rimane in attesa di un server named pipe chiamando il metodo Connect.Il costruttore ChannelManager non viene restituito finché non viene stabilita una connessione.

    • Metodo Dispose: implementa l'interfaccia System.IDisposable rilasciando le risorse di cui è stata creata un'istanza (Stream m_Stream) quando la classe esce dall'ambito.

    • Metodo ReadMessage: riceve messaggi dai client pipe.

    • Metodo SendMessage: invia messaggi ai client pipe.

  • Metodo AppControl: viene utilizzato da Alice per inviare i flag di controllo dell'applicazione a Bob e Mallory.Questi flag sincronizzano gli stati di Version, fMallory e fVerbose tra le tre finestre di comando.Il metodo AppControl non viene utilizzato per la crittografia o la trasmissione dei messaggi.Si tratta semplicemente di un meccanismo di controllo interno dell'applicazione.Questo metodo crea un oggetto ChannelManager temporaneo che viene eliminato dopo l'uso.

  • Metodo SendChannelName: metodo di servizio che gestisce l'invio di un nuovo nome di canale a un client.Questo metodo crea un oggetto ChannelManager temporaneo che viene eliminato dopo l'uso.

  • Metodo ReceiveChannelName: metodo di servizio che gestisce la ricezione di un nuovo nome di canale da un server.Questo metodo crea un oggetto ChannelManager temporaneo che viene eliminato dopo l'uso.

Dettagli sulla classe ChannelManager

La applicazioni Alice, Bob e Mallory sono connesse tramite named pipe create da istanze di ChannelManager.Ogni applicazione crea ed elimina due tipi di oggetti ChannelManager:

  • Oggetti a lungo termine: Alice e Bob creano un oggetto ChannelManager a lungo termine all'inizio dei metodi Run.Utilizzano questo oggetto per trasmettere contatti commerciali.Mallory crea due oggetti ChannelManager a lungo termine nel metodo Run: uno per comunicare con Alice e l'altro per comunicare con Bob.I canali vengono utilizzati per scambiare chiavi di crittografia e messaggi crittografati.Vengono conservati fino alla fine del metodo Run, quindi vengono eliminati.

  • Oggetti temporanei: i metodi AppControl, SendChannelName e ReceiveChannelName creano oggetti ChannelManager temporanei per eseguire un'attività specifica.Gli oggetti vengono quindi eliminati.Inoltre, nelle versioni 4 e 5, Alice invia a Bob una chiave di firma digitale privata utilizzando un oggetto ChannelManager temporaneo.

La classe ChannelManager implementa l'interfaccia System.IDisposable e gestisce le modalità di trasmissione send e receive.

La classe fornisce l'illusione di un scambio dinamico tra Alice, Bob e Mallory.In realtà, una pipe può esistere in un'unica modalità alla volta: può essere un server o un client.Pertanto, le applicazioni Alice, Bob e Mallory vengono eseguite in modo accurato e lineare.Ogni applicazione si aspetta l'apertura e la chiusura delle pipe in momenti specifici durante l'esecuzione dell'esempio.Nonostante le apparenze, la comunicazione non è asincrona.

Può sembrare che un gestore di thread stia gestendo i thread in background, ma non vengono utilizzate chiamate di threading.La temporizzazione interprocesso viene ottenuta solo tramite un'attenta interfoliazione delle chiamate send e receive tra Alice, Bob e Mallory.Di conseguenza, le tre finestre sembrano comunicare senza problemi, seguendo lo scenario descritto nella sezione Cenni preliminari sull'esempio CNG.

Uno dei vantaggi di questa implementazione è la sincronizzazione. Inoltre, il codice è semplice e lineare.Uno degli svantaggi è la mancanza di affidabilità: se un client pipe non riesce a connettersi al server, il server non risponde più.Un approccio più efficace sarebbe l'utilizzo di un server pipe multithreading, che gestirebbe correttamente tali errori.Tuttavia, per evitare complessità, nell'esempio non viene adottato tale approccio.

Dai metodi Main di Alice, Bob e Mallory e dal costruttore di classe Communicator nel file Communicator.cs viene creata un'istanza della classe ChannelManager.

Dettagli sull'utilizzo

La classe ChannelManager viene utilizzata in cinque contesti diversi: controllo dell'applicazione, trasmissione del nome del canale, trasmissione di messaggi, trasmissione della chiave di firma digitale e trasmissione di chiavi di crittografia pubbliche.Nell'elenco seguente questi contesti vengono descritti nell'ordine in cui appaiono nel codice sorgente.

  1. Controllo dell'applicazione: Alice chiama il metodo InitializeOptions all'inizio del metodo Main e riceve le opzioni della sessione dall'utente.Queste opzioni (Version, fMallory e fVerbose) vengono quindi inviate a Bob e Mallory dal metodo AppControl.Se l'utente decide di chiudere l'applicazione digitando la lettera "x", il metodo AppControl invia a Bob e Mallory la stringa "exit" anziché le opzioni della sessione.

    • Il metodo AppControl di Alice crea due server pipe ChannelManager temporanei, BobControlChannel e MalloryControlChannel.

    • I metodi AppControl di Bob e Mallory creano client pipe ChannelManager temporanei e si connettono ai rispettivi canali di controllo.

    • Bob e Mallory ricevono le opzioni della sessione da Alice ed eliminano immediatamente gli oggetti ChannelManager temporanei.

  2. Trasmissione del nome del canale: dopo la trasmissione delle opzioni della sessione, Alice invia a Bob un nuovo nome di canale.

    • Alice utilizza il metodo SendChannelName, mentre Bob e Mallory utilizzano il metodo ReceiveChannelName.Ogni metodo crea un server o un client pipe ChannelManager temporaneo.Dopo l'invio o la ricezione del nuovo nome di canale, l'istanza temporanea di ChannelManager viene eliminata.

    • Il problema di sicurezza si verifica quando Mallory intercetta il nuovo nome del canale chiamando ReceiveChannelName 200 millisecondi prima di Bob.Per una descrizione di questo problema di sicurezza, vedere Implementazione di un attacco di tipo man-in-the-middle (esempio CNG).

  3. Trasmissione di messaggi: dopo la trasmissione delle opzioni della sessione e del nuovo nome di canale, Alice, Bob e Mallory creano oggetti Communicator.I costruttori Communicator ricevono il nome del nuovo canale inviato nel passaggio precedente e lo utilizzano per creare istanze di ChannelManager a lungo termine.Questi oggetti sono le uniche istanze di ChannelManager non temporanee.Vengono mantenuti fino alla trasmissione e alla ricezione dell'ultimo messaggio, quindi vengono eliminati.

    Nota

    L'oggetto ChannelManager creato da Alice incapsula un server pipe denominato AliceAndBobChannel.Tuttavia, Mallory intercetta tale nome e invia un nome di canale diverso (AliceAndBobChannel1) a Bob.Bob ha passato questa stringa come parametro name al costruttore Communicator, creando un client pipe denominato AliceAndBobChannel1.Questa modifica del nome consente a Mallory di rappresentare Alice nei messaggi a Bob.

  4. Trasmissione della chiave di firma digitale: dopo che Alice ha creato l'oggetto Communicator, viene esaminato il flag Version.Nella versione 3 Alice invia a Bob una chiave di firma digitale tramite la named pipe PublicChannel, in cui viene intercettata da Mallory.Nelle versioni 4 e 5, crea un'istanza segreta e temporanea di ChannelManager.Questa istanza viene quindi utilizzata per trasmettere una chiave di firma digitale privata a Bob.

    Nota

    Mallory non è al corrente di questa named pipe privata, perché non ha ricevuto la versione 4 o 5 del software di messaggistica immediata.Alice continua a utilizzare l'oggetto di messaggistica a lungo termine ChannelManager creato nel passaggio 3 per inviare una firma digitale falsa a Bob.Nelle versioni 4 e 5 lo strumento di messaggistica immediata di Bob è stato aggiornato per ignorare questo oggetto.Tuttavia, Mallory ritiene che la firma sia valida e la applica sia alle proprie chiavi di crittografia che ai messaggi.In questo modo il suo tentativo di intromissione non riesce.

  5. Trasmissione di chiavi di crittografia pubbliche: il flag Version viene nuovamente esaminato.Nella versione 2 e successive l'oggetto di messaggistica a lungo termine ChannelManager creato nel passaggio 3 viene utilizzato per inviare e ricevere chiavi di crittografia pubbliche.

Dopo lo scambio di nomi di canale, firme digitali e chiavi di crittografia, Alice e Bob utilizzano l'oggetto ChannelManager creato nel passaggio 3 per trasmettere messaggi.

Vedere anche

Riferimenti

NamedPipeServerStream

NamedPipeClientStream

Concetti

Esempio di comunicazione protetta tramite Cryptography Next Generation (CNG)

Codice sorgente di ChannelManager.cs (esempio CNG)

Cenni preliminari sul codice sorgente (esempio CNG)