Aplicación nativa, autenticación de token sin inicio de sesión / contraseña

0

Estoy trabajando en un juego móvil siempre en línea (aplicación nativa de Android / iOS con Unity) y me gustaría poder autenticar el reproductor sin requerir ningún nombre de usuario / contraseña al principio. Para aquellos que lo saben, trato de lograr un esquema de autenticación similar a los famosos juegos Supercell (Choque de clanes, Boom Beach, etc.) Lo que tengo en mente:

  • La primera vez que el usuario inicia el juego, se realiza una solicitud al servidor para una nueva cuenta, el servidor envía un UUID.

  • Este UUID se almacena en el dispositivo (¿debo cifrarlo o hacer un hash?).

  • Cuando el usuario inicia el juego, lo autentico con un token ( UUID+timestamp+hmac(sha256, username+timestamp, K) ). ¿Es mejor generar un token de sesión temporal (almacenado en la base de datos) o puedo usar el token anterior para todas las solicitudes después de la autenticación?

  • Para cada solicitud, envío token+params+timestamp+hmac(sha256, token+params+timestamp, K)

Y todas las comunicaciones serán por SSL.

¿Es totalmente inseguro?

NB: En el juego podrás realizar compras dentro de la aplicación y, en este caso, la primera vez que intentes comprar algo, tendrás que vincular tu juego con tu GameCenter o Google Play o cuentas de Facebook. Esta información será almacenada en la base de datos. ¿Debo usar estas cuentas para autenticarme si es posible?

Como puede ver, no hay nada claro en mi cabeza y definitivamente no soy un experto en seguridad. Así que todos los pequeños consejos serán apreciados.

    
pregunta MamaWalter 06.08.2014 - 17:33
fuente

2 respuestas

2

¿Cuál es tu modelo de amenaza?

Si todas las conexiones se envían a través de SSL, no tiene que preocuparse por que nadie pueda detectar sus comunicaciones. Esta es en realidad la parte más fuerte de su sistema. Buen trabajo eligiendo algo estándar.

Debido a que SSL garantiza que nadie esté escuchando sus comunicaciones, deberíamos mirar los puntos finales. Tu UUID es básicamente un secreto compartido. Cualquiera con este UUID podrá imitar a sus usuarios.

En cuanto a cifrarlo o codificarlo, no. No molestar. Si tienen acceso a su UUID cifrado, ciertamente tienen acceso al código fuente de su juego, que debería contener la contraseña. Cualquier cosa que pudiera impedir que un atacante se autentique también evitaría que un cliente se autentique.

Necesitas desarrollar un modelo de amenaza. ¿Qué haría un atacante si consiguieran un UUID? Si todo lo que pueden hacer es comprar juegos para esa cuenta, entonces es muy poco lo que pueden obtener al tener un UUID. Podrían intentar enojar a un cliente robando el UUID y usándolo para comprar un montón de cosas que el cliente no quería, pero si puedes reembolsarlo, tampoco pueden enojar a un cliente.

Por otro lado, si los UUID se pueden usar para comprar cosas que son útiles para otros, entonces tienes más incentivos para que los atacantes los roben. Si pueden ser útiles para la mafia, entonces tienes una amenaza aún mayor, ya que podrían lanzar una de sus botnets a tu sistema.

Toda la seguridad se basa en un modelo de amenaza. Nada es perfectamente seguro. Como dijo una vez Kevin Mitnick, "la única computadora completamente segura es una que está desconectada de Internet, apagada, encerrada en el cemento en la parte inferior de un silo protegido por guardias armados. Incluso entonces, lo revisaría una vez en una mientras. "

    
respondido por el Cort Ammon 29.11.2014 - 06:51
fuente
1
  

Este UUID se almacena en el dispositivo (¿debo cifrarlo o hacer un hash?):

  • Para la aplicación de Android, puede utilizar esta library , que es una contenedor cifrado para SharedPreferences, porque SharedPreferences en Android almacena los datos en "texto simple", por lo que un atacante puede tener fácilmente acceso a estos datos.
  • Para la aplicación iOS: Keychain es un lugar seguro de almacenamiento de credenciales y sensible información, pero no es difícil entrar en ella tampoco especialmente en dispositivos con jailbreak).
  

Cuando el usuario comienza el juego, lo autentico con un token   (UUID + marca de tiempo + hmac (sha256, nombre de usuario + marca de tiempo, K)). Es mejor   generar un token de sesión temporal (almacenado en la base de datos) o podría   ¿Usar el token anterior para todas las solicitudes después de la autenticación?

El token de acceso se debe administrar en el lado del servidor, ya que se puede modificar en el lado del cliente (por ejemplo: un atacante puede cambiar el valor de la marca de tiempo actual del dispositivo), y el token de acceso generalmente es temporal, por lo tanto, debe actualizarlos después de un cierto tiempo dependiendo de la criticidad de su aplicación.

    
respondido por el TMR_OS 07.08.2014 - 10:56
fuente

Lea otras preguntas en las etiquetas