Complejidad Y Longitud De Las Contraseñas

Introducción
Una contraseña es algo que el usuario conoce, es similar a un número de identificación personal (PIN) que utilizamos para nuestra tarjeta de cajero automático del banco. Junto con la identificación del usuario, es el mecanismo más común de identificación y autorización implementado en aplicaciones web. A continuación se presentan las ventajas y desventajas en el uso de una contraseña como mecanismo de autenticación.

Ventajas
 * Fácil de implementar
 * Bajo costo (no requiere hardware sofisticado)
 * Fácil de usar (a menos que lo olvidemos)

Desventajas
 * Fácil de adivinar
 * Pueden ser infiltrados o utilizar fuerza bruta
 * Los usuarios tienden a olvidar su contraseña o incluirlos en notas adhesivas publicado en su monitor o debajo del teclado

Con las mejores prácticas y directrices adecuadas de aplicación, el uso de la contraseña como mecanismo de autenticación puede ser una solución rápida y fácil.

Las mejores prácticas
La longitud y la complejidad de la contraseña con la gestión de contraseñas adecuada hace que el uso de la contraseña como mecanismo de autenticación, vale la pena tener en cuenta en sus necesidades de aplicaciones web. A continuación se presentan las mejores prácticas para la longitud y complejidad de la contraseña.

Longitud de la contraseña

La longitud de la contraseña que hay que tomar en cuenta es la longitud mínima y máxima de caracteres que comprenden la contraseña de los usuarios. Para facilitar el cambio de esta longitud, su aplicación puede ser configurable posiblemente utilizando un archivo de propiedades o el archivo de configuración XML.


 * La longitud mínima: Las contraseñas deben tener por lo menos ocho (8) caracteres. La combinación de esta longitud con la complejidad hace que una contraseña sea difícil de adivinar.
 * Longitud máxima: Recuerde, la gente tiende a olvidar sus contraseñas fácilmente. Cuanto más larga sea la contraseña, la gente tiene más oportunidades de utilizar su contraseña en el sistema erróneamente.

Complejidad de la contraseña

La combinación de los caracteres debe ser de caracteres alfanuméricos. Los caracteres alfanuméricos contienen letras, números, signos de puntuación y otros símbolos matemáticos convencionales.

Para la funcionalidad de cambio de contraseña, si es posible, mantener un historial de contraseñas antiguas utilizadas. No debe almacenar las contraseñas reales para proteger contra ataques de fuerza bruta si el archivo de base de datos se ve comprometido. De esta manera, el usuario no puede cambiar a una contraseña que se utilizó un par de meses atrás.

Generación de la contraseña

El API OWASP Enterprise Security para Java tiene algunos métodos que simplifican la tarea de generar contraseñas de calidad, así como la determinación de la contraseña.

El método verifyPasswordStrength acepta una nueva contraseña y la contraseña actual. En primer lugar, comprueba que la nueva contraseña no contiene tres sub-cadenas de caracteres de la contraseña actual.
 * public void verifyPasswordStrength(String newPassword, String oldPassword)

En segundo lugar, se comprueba si la contraseña contiene caracteres de cada uno de los siguientes conjuntos de caracteres: CHAR_LOWERS, CHAR_UPPERS, CHAR_DIGITS, CHAR_SPECIALS.

Finalmente, se calcula la intensidad de la contraseña mediante la multiplicación de la longitud de la nueva contraseña por el número de conjuntos de caracteres que se compone. Un valor inferior a 16 se considera débil y una excepción será lanzada en este caso. En algún momento en el futuro, este valor será una opción configurable por el usuario.

El generateStrongPassword utiliza la aleatoriedad ESAPI para construir contraseñas seguras compuestas por letras mayúsculas y minúsculas, números y caracteres especiales. Actualmente, todos los conjuntos de caracteres están codificadas en ESAPI Encoder.java. Hay planes para hacer estos configurable por el usuario.
 * public String generateStrongPassword

There are plans to make these user configurable. The source code is available at Authenticator.java. For more information on OWASP ESAPI follow this link: OWASP ESAPI

Código de Ejemplo

Below is a sample Servlet that uses the above methods to create a new password, and compare it to a blank string.

import org.owasp.esapi.*; import org.owasp.esapi.interfaces.IAuthenticator; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class generateStrongPassword extends HttpServlet { public static final String RESOURCE_DIRECTORY = "org.owasp.esapi.resources"; private static String resourceDirectory = System.getProperty(RESOURCE_DIRECTORY); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/html"); IAuthenticator passInstance = ESAPI.authenticator; PrintWriter out = response.getWriter; String password = passInstance.generateStrongPassword; try { passInstance.verifyPasswordStrength(password, ""); out.println("New password is strong!"); } catch (Exception e) { out.println("New password is not strong enough"); }                       out.println(password); }              }

Tutor: Ingeniero Tito Armas Traductoras: Aguirre Adriana y Nazamues Milena Fecha: 2012 Noviembre