entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Enviar de forma segura contraseña a servicio REST

Estoy desarrollando una aplicación movil hibrida con un login, este envía el usuario y contraseña en un JSON a un servicio REST con una url "https://", cuando la contraseña es correcta la respuesta es una variable booleana y un token que tiene validez por un dia. No estoy seguro si deba encriptar la contraseña antes de enviarla al servicio o si basta con que se utilice el protocolo seguro https.

¿Que otras consideraciones consideraciones de seguridad dentro de la aplicación debería tomar?

Cabe señalar que el lado del servidor ya esta desarrollado, posee usuarios y contraseñas encriptadas almacenadas, esta parte no esta bajo mi responsabilidad por lo que seria difícil modificar los procesos allí existente en caso de ser necesario.

1 Respuesta

3votos

Leonardo-Tadei Puntos227320

Hola @zgluis,

si el acceso es a un servidor HTTPS, entonces nadie podrá, en principio, ver la contraseña que tu app envía.

Si la contraseña es la de cada usuario, no habrá problema, porque en caso de que alguien pudiera acceder a la contraseña accedería solo a los datos de esa persona.

En cambio si la contraseña es única para toda la app (una contraseña de acceso a la API), será más importante cuidarla y que alguien con acceso a la app no pueda verla, al menos fácilmente. En este caso, podrías usar algún mecanismo de cifrado, aunque sea por substitución, para que la contraseña de la APP no se vea como texto al analizar el binario de la aplicación.

Un plus adicional para ambos casos es rehusar el envío de información si no es a HTTPS o mejor todavía, a un URL específico.

Saludos cordiales!

2votos

magarzon comentado

Además de lo ya aportado por @Leonardo-Tadei, solo un pequeño inciso, porque es algo que suele ser un pensamiento muy común, que es que cifrar una contraseña antes de enviarla la hace más segura.

Si se cifra la contraseña en el lado del cliente, se debe descifrar en el lado del servidor, y por tanto la contraseña cifrada se convierte realmente en tu contraseña. Es decir, que si tu contraseña era hola1234, ahora, una vez cifrada, podría ser algo como bdf4da09, que es más ilegible, pero no es en sí más segura.

Solo podría aportar dos pequeños beneficios a la seguridad: un poco más fuerte a ataques de fuerza bruta (al final es una "cadena aleatoria" y no un patrón predecible) y que como decía @Leonardo-Tadei es menos legible si alguien mira el código binario de tu aplicación.

Pero estos dos pequeños beneficios no son capaces de compensar el incremento de procesamiento que requiere un cifrado/descifrado y además se diluyen enseguida: si tu API REST tiene que soportar clientes que no sean aplicaciones (es decir, una web), el algoritmo de cifrado sería público (todo lo que hace una web en la parte de cliente es público), por lo tanto un ataque de fuerza bruta usaría ese algoritmo "conocido". Por otro lado, si se mira el binario se hace más ilegibles, pero por lo general las aplicaciones móviles son fácilmente "desensamblables", sobre todo si son Android Java, por lo que se podría de nuevo, aunque con un poco más de esfuerzo, obtener el algoritmo o la clave misma (si es única).

Por lo tanto, la única solución eficiente y fiable para el envío de usuario/contraseña es utilizar HTTPS. En el caso de que se necesitara una clave única para todas las instancias/instalaciones de una aplicación, lo que se puede hacer es enviar un código de activación particular y de un solo uso, por ejemplo por email, que una vez verificado por la aplicación (mediante una petición HTTPS) reciba la clave única y la almacene en la zona segura de memoria que tienen disponible todas las app móviles.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta