Il client o il server dovrebbe generare la coppia di chiavi pubblica-privata del client?

2

Supponiamo di avere un'app di messaggistica mobile. C'è un server centrale che gestisce roba (come una directory di utenti, onboarding, ecc.) E ci sono tutti i client.

La mia app è professionale, quindi utilizza la crittografia asimmetrica per inviare messaggi in modo sicuro.

La mia domanda è, in breve, se il client o il server generano la coppia di chiavi pubblica-privata?

Se il client genera la coppia, la coppia può essere generata sul lato client e quindi inviata al server (probabilmente crittografata con la chiave pubblica del server).

Se il server genera la coppia, ho avuto un'idea più complicata:

  1. Il client genera segreti ( S )
  2. Il client crittografa il segreto con la chiave pubblica del server
  3. Il client invia segreto crittografato al server
  4. Il server decrittografa il segreto crittografato con la chiave privata del server
  5. Il server genera una coppia di chiavi pubblica-privata per il client
  6. Server crittografa la chiave privata con segreto ( S ) e la rimuove dalla memoria
  7. Il server invia la chiave privata crittografata al server
  8. Il client decrittografa la chiave privata crittografata con segreto ( S ), che aveva dall'inizio
  9. Evviva! Il cliente ora ha una chiave privata e la chiave pubblica è sul server !!! :)

Quindi, quale approccio è meglio - se il client o il server generano la coppia di chiavi pubblica-privata da un punto di vista della sicurezza? C'è un modo migliore / più efficiente / più sicuro per farlo rispetto alle mie soluzioni?

    
posta Daniel 24.07.2018 - 20:35
fonte

2 risposte

5

My question is, in short, should the client or the server generate the public-private key pair?

Nella teoria , il client dovrebbe generare la propria coppia di chiavi. In questo modo la chiave privata:

  • è noto solo al client
  • non è esposto al trasferimento

Nella pratica , non è inaudito vedere i server che generano le chiavi dei client e distribuirle. Tuttavia, questo di solito viene fatto solo nei casi in cui al client manca una risorsa necessaria che può generare una chiave e un CSR stessi:

  • processore limitato
  • richiesta interazione umana

(Quasi letteralmente, la maggior parte delle configurazioni di "server distribuisce i tasti" che ho visto si riducono a "i nostri utenti sono troppo stupidi, e il nostro gruppo di supporto non vuole tenerli tutti a mano")

Sembra che tu stia implementando server e client. Se hai quel livello di controllo, quindi genera le chiavi client sul client perché è la cosa giusta da fare.

    
risposta data 24.07.2018 - 20:46
fonte
2

should the client or the server generate the public-private key pair?

Penso che ciò dipenda dal tuo obiettivo di design:

Se si desidera che le comunicazioni siano totalmente sicure e decifrabili solo dal mittente e dal destinatario, le chiavi dovrebbero essere generate e non lasciare mai il client. Se il client è un'app per Android o iOS, cerca nel Keystore Android o nell'enclave Apple Secure in modo che le chiavi del client vengano create in un processore separato e non siano nemmeno accessibili per l'app, per non parlare del server.

Se si desidera che il server sia in grado di leggere / archiviare / registrare / modificare / wtv i messaggi, il server necessita di una copia di tutte le chiavi private (o di un protocollo in cui ogni client esegue la crittografia per la coppia di chiavi del server). A quel punto, però, rinunci a qualsiasi pretesa di privacy.

Il metodo che hai descritto dove una parte genera la chiave e la invia all'altra è uno schema ben utilizzato. In effetti, è esattamente come funziona la modalità di creazione della chiave RSA di TLS in cui il client invia un segreto premaster al server da cui viene derivata la chiave di sessione (diapositiva presa in prestito da una conversazione estiva della Royal Holloway University of London ).

    
risposta data 24.07.2018 - 20:39
fonte

Leggi altre domande sui tag