Distribuzione chiave e scambio di chiavi per un'implementazione FTP sicura semplice

2

Sto sviluppando un semplice protocollo di trasferimento file sicuro per un progetto universitario che utilizza openssl.

Ho un client (sia C) e un server (sia S).

C invierà a S messaggi come get , put , cd , ... e S invierà percorsi o file a seconda di quali messaggi ha ricevuto.

Ho creato una coppia di chiavi (pubblica, privata). Il client ha la chiave pubblica e il server ha la chiave privata.

All'inizio del mio software c'è uno scambio di chiavi simmetriche generate dal client. Dato che mi piacerebbe criptare sia i messaggi inviati dal client che i messaggi inviati dal server, è meglio usare la stessa chiave privata o due chiavi diverse?

    
posta Edge7 09.06.2013 - 17:03
fonte

2 risposte

2

Quello che stai cercando di ricreare è TLS / SSL, che è stato pubblicato per la prima volta nel 1994 (SSL), e da allora ha subito diverse revisioni, con le specifiche più recenti datate 2011 (TLS) - 17 anni di sviluppo!

In TLS ci sono chiavi separate per l'invio e la ricezione (vedi questa domanda: Separa le chiavi di lettura e scrittura nel materiale chiave TLS ), quindi sembrerebbe ragionevole per te fare lo stesso. Le parti generano anche IV di lettura e scrittura da utilizzare con i codici a blocchi.

TLS fa di tutto per combattere attacchi noti, come includere inviare e ricevere conteggi di pacchetti e numeri di sequenza come parte dell'HMAC. Alcuni degli attacchi noti sono discussi nella RFC ( 5246 TLS 1.2 ), quindi potresti volerli leggere prima inizi a lavorare sul tuo protocollo.

Avrai anche bisogno di un modo per verificare la chiave del server (o certificato, come è noto in TLS) e ciò richiederà una conoscenza a priori sul lato client, come l'impronta digitale SHA. Dovrai anche dimostrare che il server è effettivamente il detentore della chiave privata corrispondente inviando una qualche forma di sfida (in TLS è descritto nella sezione F.1.1.2 della RFC linkata sopra).

    
risposta data 09.06.2013 - 23:24
fonte
2

Hai ragione a generare chiavi simmetriche all'inizio della sessione. Più precisamente, il metodo normale consiste nel generare una chiave simmetrica (una chiave di sessione), con un protocollo che assicura che entrambe le parti generino la stessa chiave, in modo che questa chiave condivisa possa essere utilizzata su entrambi i lati. Un protocollo popolare per tale scambio di chiavi è Diffie-Hellman . (Nonostante il nome, questo non è uno scambio di chiavi simmetriche: è uno scambio di chiavi pubbliche DH, che porta le due parti a essere in grado di generare lo stesso materiale segreto.) Non è necessario che una delle parti abbia una coppia di chiavi asimmetriche per fare ciò e stabilire un canale sicuro.

Dove è necessario che almeno uno dei lati abbia una chiave privata e che l'altro lato abbia la chiave pubblica corrispondente, è per l'autenticazione. Con Diffie-Hellman, le due parti possono essere certe che nessun terzo sta per violare la loro comunicazione, ma non possono conoscere l'identità dell'altra parte, quindi un attacco man-in-the-middle è possibile: tutto l'attaccante ha fare è eseguire il protocollo di avvio della sessione con il client e il server in modo indipendente e da allora in poi i messaggi di inoltro (o meno).

Se una delle parti non è disposta a comunicare con chiunque, deve autenticare le altre parti. Esistono due metodi principali per eseguire questa operazione: con un segreto condiviso (una password) o con la crittografia a chiave pubblica. L'autenticazione della password non è semplice perché se ad es. il client invia la sua password al server, questo è pericoloso a meno che il client non sia sicuro che stia comunicando con il server legittimo. Altrimenti, in caso di un attacco man-in-the-middle, l'utente malintenzionato otterrebbe la password e potrebbe inviarlo in avanti al server per impersonare il client.

La crittografia a chiave pubblica risolve questo problema. Affinché il client possa autenticare il server, il client deve conoscere la chiave pubblica del server. Il client può inviare un messaggio crittografato con quella chiave pubblica; solo il server legittimo sarà in grado di decifrare il messaggio. Un semplice protocollo prevede che il client invii la sua password, oltre ad alcuni materiali chiave, in questo messaggio crittografato.

È possibile che entrambe le parti utilizzino una coppia di chiavi pubblica / privata. In questo caso, ciascuna parte avrà la propria chiave privata. Le chiavi private non vengono mai condivise tra le parti, altrimenti non sarebbe opportuno non utilizzare crittografie simmetriche.

Esercizi consigliati:

  1. Implementa quello che pensi sia un protocollo di canale sicuro.
  2. Una volta che la tua implementazione funziona, gioca con essa. Descrivi il tuo protocollo per iscritto o con diagrammi. Cerca di trovare una situazione in cui la tua implementazione si interrompa, in cui consente a terzi di intercettare le comunicazioni tra il client e il server, o di impersonare una delle parti, o di iniettare comandi o risposte illegittime. La crittografia è difficile, quindi non scoraggiarti se hai sbagliato: è quasi il punto dell'esercitazione.
  3. Si dice che chiunque possa costruire un protocollo crittografico che non possono rompere, se si sono sforzati abbastanza. Quindi se non riesci a rompere il tuo protocollo, consulta la documentazione su TLS , che è lo standard del settore per i canali sicuri . Trova una funzionalità in TLS che protegga da qualcosa che non lo fai. Scopri come rompere il tuo protocollo in questo modo.
risposta data 10.06.2013 - 19:54
fonte

Leggi altre domande sui tag