Hai riscontrato due problemi "difficili": autenticazione e autorizzazione. C'è abbondante di informazioni online su questo argomento, ma nel tuo caso penso che il tuo problema risale alla progettazione dell'app.
Iniziamo con due domande:
- Come fai a sapere se l'utente è autorizzato a pubblicare un punteggio elevato? ( Autorizzazione )
- Come sai che la connessione al tuo server proviene da un vero utente di gioco e non da qualcuno che impersona il gioco come nel tuo esempio Java? ( Autenticazione )
Prima di provare a reinventare la ruota, sappi che ci sono molte librerie che fanno proprio questo, con l'ulteriore vantaggio di essere maturi, testati, funzionanti e ben documentati.
Non conoscendo i dettagli della tua app, ecco alcuni suggerimenti:
- Consenti agli utenti di giocare in modalità "solo" o in "online". Nella precedente modalità il gioco è autonomo e non è necessario effettuare alcuna connessione di rete (utile per gli utenti che conoscono la privacy). In quest'ultimo caso gli utenti DEVONO registrarsi con il proprio server.
- Una volta che un utente è registrato (login / password) e hai verificato che in realtà sono un utente "reale" (risponditore di e-mail, messaggio di testo, ecc.), il tuo server può inviare un "token" giocare.
- Quando l'app vuole inviare il suo punteggio più alto al tuo server DEVE autenticarsi fornendo il token in un modo simile a quello che utente @ mike-mackintosh ha descritto nella sua risposta.
- Tutte le comunicazioni da / a devono ovviamente essere crittografate con TLS o altre forme di crittografia avanzata.
- La tua app dovrebbe convalidare i certificati per evitare attacchi man-in-the-middle.
Lo scenario è semplificato: ovviamente un utente malintenzionato con risorse sufficienti potrebbe registrare un account falso, eseguire il reverse engineering dell'app, determinare il messaggio da utilizzare e inviare dati fasulli al server. Per impedirlo dovrai chiedere a la piattaforma di verificare che l'app non sia stata manomessa, il che significa a sua volta estendere la catena di trust al sistema operativo che esegue l'app, e così via . Alla fine diventa complicato (mai sentito parlare di " trusted computing " e gestione dei diritti digitali?) E dipende dal valore che stai cercando di proteggere.
Un'altra strada della ricerca potrebbe essere una forma di convalida sul lato server. Ad esempio, ogni volta che un utente pubblica un punteggio superiore a X, deve anche fornire "prova" che ha sbloccato un determinato risultato, ad es. una stringa casuale che viene salvata nel profilo utente quando raggiunge un punto specifico nel gioco. In questo caso è possibile ricontrollare sul lato server che l'utente ha effettivamente superato i risultati precedenti in precedenza.
Puoi rendere più interessanti le cose generando i token di "livello" combinando l'IMEI del telefono con una chiave casuale e utilizzando una qualche forma di crittografia a chiave pubblica in modo che ogni utente sia legato al telefono. Il che funzionerebbe, a meno che qualcuno non usasse una ROM personalizzata per Android che consentisse di modificare l'IMEI del telefono e così via.