La migliore pratica dipende dall'uso esatto.
Ciò che ricavo dalla tua domanda è che hai un'app che ti invia dati e ora GPS, come un'applicazione "footprint". Desiderate assicurarvi di non essere alimentati con dati falsi e quindi volete assicurarvi che i dati provengano dal vostro vero cliente e non da un falso.
Beh, sfortunatamente, come hanno affermato altre risposte, è impossibile. Dato il file APK per la tua app, qualcuno può decompilarlo in modo abbastanza fattibile nel codice sorgente Java, possibilmente non elegante come la tua fonte, ma sicuramente funzionale. Possono quindi utilizzare il tuo codice per creare la propria app, che comunica con la tua esattamente come ti aspetti e usarla per fornirti dati falsi.
Pertanto, qualunque schema tu usi per il trasporto dei dati dovrebbe mai fidarsi del cliente. Dovrebbe invece fidarsi di utente .
Considera questa soluzione; il tuo server delle app è firmato con un certificato di chiave pubblica attendibile (potrebbe, in questa circostanza, essere considerato attendibile per la sola ragione per cui la tua applicazione conosce il certificato esatto che dovrebbe essere dato; questo è chiamato "certificato" pinning "e funziona indipendentemente dal fatto che il certificato sia stato firmato da una CA globale o meno). Su richiesta, presenta questo certificato a chi lo richiede; è un'informazione pubblica, potresti incollare questa cosa su ogni forum degli hacker su Internet e non sarebbe meno sicuro. Il tuo cliente utilizza questo certificato per negoziare un tunnel di comunicazione sicuro; questa è roba abbastanza standard.
Ora hai riservatezza . Hai bisogno di autenticità ; non importa che nessun altro possa ascoltare la conversazione tra voi due se non sapete con certezza chi è dall'altra parte. Quindi, una volta che il canale è aperto, la prossima cosa che ti aspetti è una richiesta di autenticazione contenente le credenziali dell'utente. Devi rifiutare qualsiasi richiesta di invio di dati GPS se la sessione non è stata autenticata. Le credenziali che l'utente fornisce in tale richiesta potrebbero essere il nome utente e la password, l'IMEI o l'indirizzo MAC del telefono, il codice a 10 cifre da un crypto key fob, qualsiasi cosa si ritenga necessaria per garantire correttamente che solo un particolare utente potrebbe essere in grado di fornire tali credenziali.
Una volta ottenute tali credenziali e verificato che corrispondono alle aspettative, tuttavia, si desidera farlo, restituire loro un "token di autenticazione". Questo è semplice come un numero casuale diverso da quello utilizzato per qualsiasi altra sessione aperta. Anche un V4 GUID è una buona scelta. Questo identificatore sarà richiesto come parte di qualsiasi richiesta di invio o ricezione di dati su questo canale durante questa sessione, sarà solo essere accettato su questo particolare canale e solo fino a quando come questa sessione unica è aperta.
Una volta impostato tutto questo, qualsiasi chiamata di servizio effettuata sul canale sicuro di quella sessione che include il token di autenticazione corretto può generalmente essere considerata attendibile. Probabilmente dovresti includere un'altra cosa, che è una misura per proteggersi dagli attacchi di replay. Un attaccante non deve sapere esattamente cosa viene inviato avanti e indietro per rovinarti semplicemente ripetendo ciò che è già stato detto. Pertanto, per garantire che il tuo sistema gestisca un messaggio unico una sola volta, indipendentemente dal numero di volte inviato, ogni messaggio dovrebbe includere un nonce , un valore univoco utilizzato una volta. Un semplice valore del contatore di sequenza, che fa parte della struttura della richiesta e crittografato dal canale sicuro, dovrebbe essere sufficiente per questo; quindi, tutto ciò che devi fare è ignorare qualsiasi messaggio il cui numero di sequenza non è il successivo che ti aspetti di ricevere dal client (può esserci qualche tolleranza d'errore inerente a questo, ma mai accetta lo stesso tipo di richiesta di servizio dallo stesso client con lo stesso numero di sequenza due volte).