Permítanme comenzar diciendo que leí otras preguntas de StackExchange relacionadas con esto y que realmente no pudieron responder mi pregunta. Tengo la sensación de que esto puede ser un problema sin solución, pero me pregunto si tal vez haya un medio feliz que satisfaga mis necesidades.
Tengo una aplicación para Android. Sin embargo, no se basa en el inicio de sesión en el sentido tradicional de que los usuarios no se registran con un correo electrónico ni nada. Simplemente creamos automáticamente una cuenta para ellos con un UUID generado aleatoriamente como su "inicio de sesión" en el servicio. Para obtener este UUID, la aplicación de Android envía una solicitud a un servicio web que indica que es un usuario nuevo que acaba de instalar la aplicación. El servicio web luego devuelve un UUID que se usará para cualquier acceso adicional a la aplicación. El objetivo de esto es hacerlo para que la información específica del usuario aún pueda almacenarse en la base de datos, pero los usuarios no tienen que pasar por la molestia de crear una cuenta e iniciar sesión cada vez.
Obviamente, las solicitudes al servicio web para otras acciones están restringidas por tener un UUID válido. Sin embargo, el servicio web para crear la cuenta no tiene restricciones, lo que significa que un atacante podría enviar solicitudes GET de spam desde cualquier dispositivo para crear cualquier número de usuarios que deseen e inundar la base de datos / servidor.
Mi pregunta es, ¿cómo se puede evitar esto? Entiendo el concepto de un secreto incrustado en la aplicación de Android para acceder al servicio web, pero parece que un atacante puede obtener fácilmente cualquier secreto generado por el cliente al descompilar el APK. Otra idea fue restringir el acceso por dirección MAC, lo que significa que solo las direcciones MAC con la aplicación instalada podrían alcanzar la URL del servicio web de creación del usuario. Pero debido a la simulación de MAC, eso también parece una mala idea.
¿Existe una buena manera de tener un secreto generado por el cliente que no sea fácil de obtener al examinar el código fuente? Sé que esta es una pregunta muy difícil, pero si alguien tiene alguna idea, sería genial.