Una forma simple de asegurar un servicio web utilizado por clientes móviles

3

Actualmente estoy trabajando en un servicio web RESTful con Java que utilizan los dispositivos móviles, es decir, Android e iOS, usando un marco que me permite abstraerme de ambos. Estoy agregando esta información porque significa que estoy ligeramente limitado cuando se trata del uso de marcos que podrían ayudar con la seguridad.

Lo que estoy haciendo actualmente es lo siguiente:

El cliente tiene la contraseña almacenada en texto sin formato en un archivo interno de la aplicación. Eso es porque necesito enviar el nombre de usuario y la contraseña con cada solicitud - > Sosegado. Se transmite a través del encabezado de autorización HTTP como nombre de usuario: contraseña codificada en Base64. La transmisión se realiza a través de HTTPS. El servidor decodifica el nombre de usuario + contraseña y calcula un hash a partir de la contraseña que luego verifica con un hash para ese usuario en la base de datos. He tomado el algoritmo de hash y el código de aquí y here .

Mis suposiciones:

  • Si asumo que el propio cliente no se ha comprometido, esto debería ser seguro.
  • Si alguien obtiene acceso a la base de datos del servidor, los usuarios deberían estar seguros porque las contraseñas están ocultas.
  • Puedo transmitir las contraseñas al servidor en texto sin formato (Base64), porque la transmisión en sí misma está protegida a través de HTTPS.

Solo estoy trabajando en este proyecto en mi tiempo libre, lo que significa que no quiero dedicar demasiado tiempo solo a la seguridad y, como es solo un juego, secuestrar una cuenta tampoco sería tan crítico. Sin embargo, todavía me gustaría tener un mecanismo de autenticación robusto.

Mis preguntas:

  • ¿Son correctas mis suposiciones?
  • ¿Cómo sería posible comprometer mi enfoque actual?
  • ¿Qué podría hacer para mejorar la seguridad?
pregunta noone 13.02.2015 - 10:29
fuente

1 respuesta

2

Una forma de atacar esto sería con un ataque de repetición. Si recibo el mensaje, puedo reenviarlo y el servidor pensaría que soy un usuario autenticado y me concederá el acceso.

Esto se puede resolver con el servidor enviando un desafío (por ejemplo, un token de una sola vez). El desafío debe incluirse de alguna manera junto con el nombre de usuario y la contraseña. Es importante que este desafío / token sea aleatorio para que la persona con intenciones maliciosas no pueda adivinarlo. Una solución aún más simple podría ser agregar la marca de tiempo y tener un intervalo en el cual la marca de tiempo incluida en la respuesta debe estar dentro.

    
respondido por el Anders Nordin 13.02.2015 - 10:42
fuente

Lea otras preguntas en las etiquetas