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).