Guía de Referencias sobre Autentificación



{| style="padding: 0;margin:0;margin-top:10px;text-align:left;" |- Last revision (mm/dd/yy): // = Introducción = La autentificación es el proceso de verificación de que un individuo, entidad o sitio Web es quien dice ser. En el contexto de una aplicación Web, la autentificación, comúnmente es realizada mediante el envío de un nombre de usuario o ID y, uno o más datos de información privada que solo un determinado usuario debe conocer.
 * valign="top" style="border-right: 1px dotted gray;padding-right:25px;" |

El manejo de sesiones es un proceso por el cual un servidor mantiene el estado de una entidad interactuando con él. Esto es requerido por un servidor para recordar como debe reaccionar a las peticiones posteriores a lo largo de una transacción. Las sesiones son mantenidas en el servidor por un identificador de sesión el cual puede ser pasado y devuelto entre el cliente y el servidor al transmitir y recibir solicitudes. Las sesiones deben ser únicas por usuario e informáticamente, muy difíciles de predecir.

= Reglas generales de autentificación =

ID de usuario
Asegúrese de que sus nombres/identificadores de usuarios no sean sensibles a mayúsculas y minúsculas. El usuario 'smith' y el usuario 'Smith' deberían ser el mismo usuario.

Dirección de correo electrónico como ID de usuario
Muchos sitios utilizan la dirección de correo electrónico como identificador de usuario, lo cual es un buen mecanismo para segurar un identificador único por cada usuario sin agregarle a éstos la carga de tener que recordar un nuevo nombre de usuario. Sin embargo, muchas aplicaciones Web no tratan correctamente las direcciones de correo electrónico, debido a conceptos equivocados sobre lo que constituye una dirección de correo electrónico válida.

Specifically, it is completely valid to have an mailbox address which:
 * Es sensible a mayúsculas y minúsculas en la parte local
 * Tiene caracteres no alfanuméricos en la parte local (incluyendo + y @)
 * Tiene cero o más etiquetas (aunque ciertamente cero no va a ocurrir)

La parte local es la parte de la dirección de correo electrónico que se encuentra a la izquierda del caracter '@'. El dominio es la parte de la dirección de correo electrónico que se encuentra a la derecha del caracter '@' y consiste en cero o más etiquetas unidas por el caracter de punto.

Al momento de estar escribir este artículo, el RFC 5321 es el estándar actual que define el protocolo SMTP y lo que constituye una dirección de correo electrónico válida.

Por favor, tenga en cuenta que las direcciones de correo electrónico deberías ser consideradas datos públicos. En aplicaciones de alta seguridad, podrías asignarse los nombres de usuario y ser secretos en lugar de ser datos públicos definidos por el usuario.

Validación
Muchas aplicaciones Web contienen expresiones regulares informáticamente muy costosas e inexactas contain computationally expensive and inaccurate regular expressions para intentar validar las direcciones de correo electrónico.

Cambios recientes generaron que el número de falsos negativos se viera incrementado, particularmente debido a:
 * El aumento de popularidad de las sub-direcciones de proveedores como Gmail (comúnmente usando + como token en la parte local para afectar la entrega)
 * Nuevos gTLDs con nombres largos (muchas experesiones regulares comprueban el número y longitud de cada etiqueta en el dominio)

Siguiendo el RFC 5321, las mejores prácticas para la validación de una dirección de correo electrónico deberían ser:
 * Comprobar la presencia de al menos un símbolo de @ en la dirección
 * Asegurarse de que la parte local no es de más de 64 bytes
 * Asegurarse de que el dominio no es de más de 255 bytes
 * Asegurarse que sea una dirección de entrega verídica (NdT: se refiere a que el correo pueda ser entregado)

Para asegurarse que una dirección de entrega sea verídica, la única forma es enviar un correo electrónico al usuario y que éste deba tomar alguna acción para confirmar que lo ha recibido. Más allá de confirmar que la dirección de correo electrónico es válida y reciba los mensajes, esto también proporciona una confirmación positiva de que el usuario tiene acceso al buzón de correo y es probable esté autorizado a usarlo. Esto no significa que otros usuarios no tengan acceso al mismo buzón de correo, cuando por ejemplo el usuario utiliza un servicio que genera una dirección de correo electrónico deshechable.

Normalización
Como la parte local de las direcciones de correo electrónico son, de hecho, sensibles a mayúsculas y minúsculas, es importante almacenar y comparar las direcciones de correo electrónico correctamente. Para normalizar la entrada de una dirección de correo electrónico, debería convertir la parte del dominio SOLO a minúsculas.

Desafortunadamente, esto hace y hará a la entrada, más difícil de normalizar y de coincidir correctamente con los intentos del usuario.

Es razonable aceptar solo una única capitalización de diferentes alternativas para direcciones de correo electrónico idénticas. Sin embargo, en este caso es crítico para:
 * Almacenar la parte del usuario tal y como fue provista y verificada por el usuario en el proceso de verificación
 * Realizar comparaciones lowercase(provista) == lowercase(almacenada)

Implementar controles adecuados de fortaleza de contraseña
Una de las principales preocupaciones cuando se utilizan contraseñas para la autentificación, es la fortaleza de las contraseñas. Una política de contraseñas "fuertes" hace que sea difícil o incluso improbable adivinar la contraseña a través de medios manuales o automatizados. Las siguientes características definen una contraseña fuerte:

Las siguientes indicaciones están disputadas. Por favor, vea la presentación de OWASP (en inglés), "Your Password Complexity Requirements are Worthless - OWASP AppSecUSA 2014" para más información.

Longitud de la contraseña
Las contraseñas más largas proporcionan una mayor combinación de caracteres y en consecuencia hacen que sea más difícil de adivinar para un atacante.


 * La longitud mínima de las contraseñas debería ser forzada por la aplicación.
 * Las contraseñas menores a 10 caracteres son consideradas débiles.

Mientras que la longitud mínima forzada puede causar problemas para la memorización de la contraseña en algunos usuarios, las aplicaciones deberían alentarlos a establecer frases de paso o passphrases (frases o combinaciones de palabras) que pueden ser mucho más largas que las contraseñas típicas y mucho más fáciles de recordar.


 * La longitud máxima de la contraseña no debería establecerse demasiado baja, ya que evitará que los usuarios puedan crear frases de paso (passphrases). La longitud máxima típica es de 128 caracteres.
 * Passphrases shorter than 20 characters are usually considered weak if they only consist of lower case Latin characters.

Complejidad de la contraseña
Las aplicaciones deberían imponer reglas de complejidad de contraseñas para evitar las contraseñas fáciles de adivinar. Los mecanismos de contraseñas deberían permitir al usuario, poder tipear casi cualquier caracter como parte de su contraseña, incluyendo el caracter de espacio. La contraseñas deberían, obviamente, ser sensibles a mayúsculas y minúsculas a fin de incrementar la complejidad de las mismas. Ocasionalmente, encontramos sistemas donde las contraseñas no son sensibles a mayúsculas y minúsculas, frecuentemente debido a problemas de sistemas heredados como los viejos ordenadores centrales que no tenían contraseñas sensibles a mayúsculas y minúsculas.

El mecanismo de cambio de contraseña debería requerir un nivel mínimo de complejidad que tenga sentido para la aplicación y su población de usuarios. Por ejemplo:


 * La contraseña debe reunir al menos 3 de las siguientes 4 reglas de complejidad
 * al menos 1 mayúscula (A-Z)
 * al menos 1 minúscula (a-z)
 * al menos 1 dígito (0-9)
 * al menos 1 caracter especial (puntuación) &mdash; no olvidar de tratar también, a los espacios en blanco como un caracter especial
 * al menos 10 caracteres
 * no más de 128 caracteres
 * no más de 2 caracteres indénticos consecutivos (ej., 111 no está permitido)

Topologías de contraseña

 * Prohibir topologías de contraseñas de uso común
 * Forzar a varios usuarios a utilizar diferentes topologías de contraseña
 * Exigir un cambio mínimo de topología entre viejas y nuevas contraseñas

Información adicional

 * Asegúrese de que todos los caracteres que el usuario tipea están realmente incluidos en la contraseña. Hemos visto sistemas que truncan la contraseña a una longitud inferior de la que el usuario provee (ej., truncada a los 15 caracteres cuando se han ingresado 20).
 * Esto es manejado usualmente al establecer la longitud de TODOS los campos de contraseña exactamente como la longitud máxima de la contraseña. Esto es particularmente importante si su longitud máxima de contraseña es corta, como 20-30 caracteres.

Si la aplicación requiere políticas de contraseña más complejas, será necesario ser muy claro sobre cuáles son esas políticas.
 * La política requerida necesita ser indicada explícitamente en la página de cambio de contraseña
 * asegúrese de enumerar cada carácter especial que permite, para que sea evidente para el usuario

Recomendación: