Quando dovrei generare nuove chiavi pubbliche e private usando RSA?

4

Sto creando un enorme gioco mobile online. Ho alcune domande per voi ragazzi perché le mie conoscenze in crittografia e l'invio di dati attraverso la rete in modo sicuro sono piuttosto scadenti.

Alcuni dettagli:

  • Ogni utente ha un account
  • Per accedere devi fornire nome utente e password (tramite l'app, non il browser web)
  • I dati vengono trasferiti dal client (dispositivo mobile) al server da qualche parte.

Semplice! Ok, per quanto ne so, la normale autenticazione web è protetta da SSL, che è semplicemente "invia semplice, sei al sicuro".

Sul cellulare non posso usare SSL (anche se Android fornisce alcuni metodi, non posso causare il porting del mio gioco su iOS, utilizzando diversi motori di gioco / networking ecc.)

Devo rendere sicuro il processo di "invio e ricezione" in modo che una terza persona non catturi le credenziali dell'utente.

Come ho letto, il modo migliore per eseguire questa operazione è il metodo RSA che utilizza chiavi pubbliche e private per crittografare / decrittografare i pacchetti.

Da quello che so funziona come:

  • ci sono due chiavi, private, public e un messaggio: "message".
  • chiunque può ottenere una chiave pubblica (perché è pubblica)
  • solo il server ha accesso alla chiave privata
  • chiunque può crittografare il "messaggio" con la chiave pubblica e avrà sempre lo stesso aspetto (stesso messaggio crittografato con la stessa chiave pubblica)
  • il messaggio crittografato può essere decodificato in un solo modo - utilizzando una chiave privata e assomiglierà al primo messaggio: "messaggio".
  • le chiavi pubbliche e private non sono uguali ma utilizzano algoritmi di crittografia / decrittografia differenti in modo che funzioni magicamente che alla fine il messaggio è lo stesso

Per favore, correggimi se sbaglio!

E qui ci sono le mie domande:

  • Ho ragione nell'esempio sopra, che i pacchetti inviati in questo modo (e con la chiave pubblica che è realmente pubblica) sono protetti (ovviamente tutto può essere decifrato) ma, sai, è "sicuro"?
  • Dovrebbe ogni utente avere la propria coppia di chiavi?
  • Quando dovrei generare una nuova coppia di chiavi? Con ogni accesso?
  • Quando dovrei inviare una chiave pubblica all'utente? Quando fa clic su "registrati" o "accedi" (con campi di testo già riempiti con i dati)? O quando apre l'app?

Se c'è qualcuno che potrebbe spiegare un po 'queste cose, ti sarei grato! :)

Due ulteriori domande a @Luke Park

La chiave pubblica è pubblica e hai detto che non dovrebbe essere inviata tramite la rete. Significa che con una chiave pubblica l'utente può decifrare i dati in qualche modo?

E il secondo: Hai detto che dovrei raggruppare la chiave pubblica con l'applicazione. Se la chiave pubblica è anche uno strumento pericoloso nelle mani di un hacker, è consigliabile archiviarlo in codice? Come so, ci sono modi per recuperare i dati dal programma compilato.

E un extra! Se la chiave è in bundle (probabilmente con hardcoded) - dovrebbe rimanere sempre la stessa o dovrei mai cambiare la coppia (generare una nuova)? Mentre leggo da qualche parte, avendo una chiave pubblica "pubblica" è possibile decifrare i dati (ci vuole un po 'di tempo, ma è possibile).

    
posta Spectre 05.09.2016 - 20:28
fonte

1 risposta

4

In generale e con alcuni equivoci, ciò che hai detto è corretto. La differenza principale è che il testo cifrato (ad es. Dopo aver cifrato il messaggio con la chiave pubblica) non è sempre lo stesso, RSA introduce alcuni dati casuali e padding che fanno sì che il testo cifrato prodotto sia diverso, anche se il testo in chiaro è lo stesso. Questo probabilmente non ti causerà alcun problema, ma contribuisce alla sicurezza.

Personalmente, penso che lo sforzo richiesto per far funzionare TLS valga la pena di implementare la propria soluzione. Tuttavia, se vuoi farlo da solo ...

Non vorrei generare una nuova coppia di chiavi per ogni utente. Una coppia di chiavi per server singolo sarebbe sufficiente. Distribuisci la chiave pubblica con la tua applicazione e mantieni la chiave privata sul tuo server. Utilizza RSA per non crittografare i tuoi dati di accesso, ma per negoziare un codice AES e utilizzarlo per crittografare i tuoi dati. Questo è un concetto base utilizzato da TLS. Uno dei motivi per cui questo viene fatto è che la dimensione del testo in chiaro che può essere crittografato da RSA è limitata dalla dimensione del bit della chiave. Generalmente più di ~ 240 byte non possono essere crittografati senza applicare più volte RSA, il che è una pessima idea in termini di velocità e sicurezza.

Ricorda di autenticare correttamente i tuoi dati, utilizzando HMAC o una modalità autenticata come GCM. Altrimenti il tuo carico utile potrebbe essere modificato (non letto) in transito.

Non inviare la chiave pubblica all'app, dovrebbe essere fornita in bundle con l'app. Se invii la chiave pubblica sul tuo canale non sicuro all'app, allora non verrà interrotta la modifica in transito. Un utente malintenzionato potrebbe sostituirlo con la sua chiave pubblica e quindi decrittografare il traffico (ei dettagli di accesso) con la sua chiave privata.

Ripeto, TLS sarebbe migliore e più sicuro di implementare la tua, ma sembra che tu pensi che ciò non sia possibile.

EDIT: Dico di non inviare la chiave pubblica sulla rete non perché sia "pericolosa" o una risorsa quando è nelle mani sbagliate, ma perché si invia la chiave pubblica in testo semplice (ad esempio su HTTP o TCP non elaborati). Dato che chiunque può modificare questo traffico (essere in grado di vederlo non è un problema), potrebbe sostituire la chiave pubblica con la propria chiave pubblica OWN prima che raggiunga la tua app. Se la chiave è già in bundle con l'app, entrambe le parti hanno già le loro chiavi (ad esempio l'app con il pubblico e il server con il privato).

La chiave pubblica non è utile a nessuno per scopi diversi dalla crittografia e dalla verifica. Non è qualcosa che devi nascondere. Devi solo essere in grado di verificare che sia la chiave pubblica corretta. Se impacchettate questo con la vostra app, la sicurezza utilizzata da App Store e Play Store sarà sufficiente per collegarla al dispositivo degli utenti con la vostra app.

    
risposta data 05.09.2016 - 22:43
fonte

Leggi altre domande sui tag