Sto cercando di ottenere un modo sicuro per scambiare le chiavi tra la mia applicazione client e il server.
L'obiettivo è crittografare tutti i messaggi XML con AES256. Questi XML saranno trasferiti al server usando https (post). sì, so che l'AES256 probabilmente è eccessivo poiché utilizzerà già HTTPS, ma la sicurezza è molto importante nel mio caso in quanto sono i dati finanziari che sto trasferendo.
Il motivo per cui utilizzo AES256 è che è ancora molto strong e praticamente indistruttibile (se implementato correttamente, ecco perché sono qui)
Ho la stessa idea generale di questa domanda: È questo RSA / AES combinazione buona? Ma voglio rendere l'implementazione sicura.
la mia idea attuale:
-
Imposta una CA (posso installare il certificato sul client in modo sicuro ambiente)
-
Il client genera una coppia di chiavi RSA e invia una chiave pubblica al server. (potrebbe anche essere in env protetto)
-
Il cliente richiede lo scambio di chiavi (richiesta di segni con RSA)
-
Il server genera una nuova chiave AES Chiave di crittografia server con chiave pubblica di
-
client Server invia la chiave crittografata e firma il messaggio con RSA
-
Il client controlla la firma e decrittografa la chiave
Dopo questo voglio fare un passo di verifica, ma non sono del tutto sicuro di quale sia il modo migliore per farlo. Stavo pensando di consentire al client di crittografare la chiave AES con la chiave di pubblicazione del server e di firmare il messaggio. quindi il server può decodificare di nuovo, ma poi trasferisco di nuovo la chiave e non sono sicuro che questo possa rappresentare un rischio per la sicurezza.
Si noti che tutti questi messaggi sono già stati trasmessi su https (con certificato valido)
È un modo sicuro? o c'è un modo migliore / più semplice?
un'altra nota: il server non accetterà una nuova richiesta di chiave se quel client ne ha già una (ogni client ha un ID univoco) ma se necessario il server può costringere il Cliente a generare una nuova chiave. Nuove chiavi possono anche essere forzate in un momento casuale.
Ho appena realizzato che mi sono dimenticato di spiegare una cosa importante:
Lo scambio di chiavi deve avvenire una volta, dopo di che la chiave deve essere memorizzata localmente. Poiché l'applicazione client deve ancora essere in grado di crittografare i messaggi senza connessione Internet. a quel punto c'è una coda di messaggi criptati.
Quindi non è come se stessi facendo lo scambio ogni volta, ma solo una volta (o una volta al mese) per scambiare le chiavi in modo che la crittografia AES possa continuare.