Vorrei iniziare dicendo che ho letto altre domande su StackExchange relative a questo problema e che non erano in grado di rispondere alla mia domanda. Ho la sensazione che questo possa essere un problema irrisolvibile, ma mi chiedo se forse c'è un mezzo felice che soddisferà le mie esigenze.
Ho un'applicazione Android. Tuttavia, non è basato sul login nel senso tradizionale del fatto che gli utenti non si iscrivano con una e-mail o altro. Creiamo automaticamente un account per loro con un UUID generato casualmente come "accesso" al servizio. Per ottenere questo UUID, l'applicazione Android invia una richiesta a un servizio web che indica che si tratta di un nuovo utente che ha appena installato l'applicazione. Il servizio web restituisce quindi un UUID che verrà utilizzato per ulteriori accessi all'applicazione. Il punto è fare in modo che le informazioni specifiche dell'utente possano ancora essere archiviate nel database, ma gli utenti non devono passare attraverso la seccatura di creare un account e accedere ogni volta.
Ovviamente, le richieste al webservice per altre azioni sono tutte limitate dall'avere un UUID valido. Tuttavia, il servizio web per la creazione dell'account non ha restrizioni, il che significa che un utente malintenzionato potrebbe inviare richieste GET ad esso da qualsiasi dispositivo per creare qualsiasi numero di utenti che desidera e riempire il database / server.
La mia domanda è, come può essere evitato? Comprendo il concetto di un segreto incorporato nell'applicazione Android per accedere al servizio web, ma sembra che qualsiasi segreto generato dal client possa essere facilmente ottenuto da un utente malintenzionato decompilando l'APK. Un'altra idea era di limitare l'accesso tramite l'indirizzo MAC, nel senso che solo gli indirizzi MAC con l'app installata potevano raggiungere l'URL del servizio web di creazione degli utenti. Ma a causa del MAC-spoofing, anche questa sembra una cattiva idea.
C'è un buon modo per avere un segreto generato dal cliente che non è facile da ottenere esaminando il codice sorgente? So che questa è una domanda molto difficile, ma se qualcuno ha qualche intuizione che sarebbe grandiosa.