Domanda

Al momento sto sviluppando un sistema per la trasmissione di dati tra client e server, e si chiedeva che cosa la forza della crittografia ho pensato di usare era.

Il mio pensiero era quello di avere una coppia di chiavi pubblica / privata RSA e distribuire la chiave pubblica ad ogni cliente (lasciando la chiave privata esclusivamente sul server). Ogni cliente avrebbe quindi generare la propria chiave AES e RSA cifrare. Avrebbero poi AES crittografare i propri dati e inviare i dati crittografati e criptati chiave AES al server. Il server quindi decifrare la chiave AES utilizzando la chiave privata, e poi decodificare i dati utilizzando la chiave AES.

Ci sono problemi di sicurezza che mi manca e / o c'è un modo migliore per fare questo?

È stato utile?

Soluzione

Questo è quasi esattamente come funziona SSL / TLS (controllare la sezione stretta di mano). L'unica cosa per renderlo più forte è quello di generare la chiave AES per ogni connessione, invece di usare la stessa chiave di volta in volta. Si potrebbe anche voler firmare digitalmente i messaggi che vanno avanti e indietro per evitare di tipo man-in-the-middle e altri spoofing.

In linea generale, la creazione di un buon sistema di crittografia è molto difficile. Quando possibile, si dovrebbe sempre favorire un'applicazione esistente (attendibile) per dare una mano. In questo caso, si potrebbe considerare l'invio di messaggi tramite HTTPS, piuttosto che creare il proprio sistema.

Altri suggerimenti

Ci dovrebbe dare maggiori informazioni sulla lingua e la piattaforma in uso, in modo che possiamo dare raccomandazioni specifiche sulle librerie che già esistono e Quale sarà gestire i dettagli per voi. Utilizzando primitive crittografiche direttamente non è banale e difficile da ottenere esattamente a destra, e con la crittografia, devi essere "non proprio giusto" solo una volta per la vostra sicurezza per essere rotto.


Per rispondere alla tua domanda, è generalmente una migliore idea di creare un segreto di sessione (la chiave AES) attraverso un scambio Diffie-Hellman , e ogni lato utilizzare la sua chiave privata RSA per firmare i suoi dati di scambio chiave.

In caso contrario, se il segreto della sessione non viene stabilita attraverso uno scambio di DH, un avversario che guadagna l'accesso alla chiave privata RSA (che deve essere memorizzati da qualche parte) potrebbe decifrare tutto il traffico che è stato mai inviato tra client e server.

Se il segreto è ha stabilito attraverso uno scambio DH, quindi solo la parte di autenticazione del protocollo sarebbe esposto. Anche se un avversario in possesso della chiave privata RSA quindi, potrebbero non essere in grado di leggere qualsiasi precedente comunicazione, che ancora potrebbe o immettere un dialogo autenticato con il client / server o lanciare un attacco man-in-the-middle (che può essere o non essere fatto facilmente, a seconda della rete).

Una vulnerabilità sarebbe se un attaccante sostituito la loro chiave pubblica per la chiave pubblica "reale". Allora essi sarebbero in grado di intercettare il traffico come un "man-in-the-middle".

Protocolli come S / MIME, PGP e TLS utilizzano la crittografia RSA per il trasporto di chiavi così come si propone. Tuttavia, le chiavi pubbliche che usano sono in certificati firmati dalle autorità di fiducia.

L'integrità di queste autorità di fiducia deve essere accuratamente protetto. Ad esempio, potrebbero essere bruciati in un token hardware a prova di manomissione, o un MAC possono essere calcolate su di loro utilizzando una password.

Non sono sicuro che il vostro approccio proteggerà nulla! Hai intenzione di mantenere la chiave privata sul server e la chiave pubblica sarà distribuito. Se ricevo una stretta della vostra chiave pubblica, sarò in grado di interagire con il server a volontà. Penso che si dovrebbe invertire la proprietà chiave; ogni cliente terrà è-propria chiave privata e il server avrà un elenco di chiavi pubbliche (Ala SSH). Il server dovrà aggiungere le chiavi pubbliche 'autorizzati e solo ai titolari di chiavi private saranno in grado di connettersi.

Spero che questo aiuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top