Patrón de Claves en Formularios
Friday 2 de December, 2005, 10:32
Desde hace un tiempo vengo observando un problema común que sorprendentemente parece no haber llamado mucho la atención. Me refiero al manejo de claves en los formularios, tanto en sistemas de autenticación y acceso, como en registro de usuarios nuevos.
Como medida de seguridad razonable HTML define un tipo de input, o campo de ingreso de texto especial, definido por el atributo type como password. La propia definición indica que a diferencia del input de texto y los de tipo password es que estps últimos deben enmascarar su contenido mediante caracteres como asteriscos:
Like “text”, but the input text is rendered in such a way as to hide the characters (e.g., a series of asterisks).
Si bien esto es razonable y provee una aparente seguridad (sólo aparente, porque el texto de la clave es siempre accesible), es común que los usuarios se equivoquen al ingresar una clave y que la única manera para corregirla sea borrar todo y escrirla nuevamente. El problema es más severo en situaciones como el registro de un nuevo usuario, en que es común solicitar la creación de una clave y el uso de un segundo campo para confirmar la clave original. En estos casos, ante cualquier duda, el usuario debería borrar ambos campos, el de clave y el de confirmación, y escribirlo todo nuevamente.
Pero también es común que ocurra otra situación, que personalmente he hecho y que además he observado en otros repetidas veces: cuando se solicita la confirmación de una clave, el usuario copia la clave escrita originalmente y la pega en el nuevo campo. Si la clave estaba mal escrita, terminará sin poder acceder al sistema porque la clave registrada no era la que pensó que había escrito. Este es un problema severo.
Soluciones
La lógica de ocultar la clave tiene sentido cuando el usuario no está solo, pero si se encuentra en una situación de confianza es perfectamente razonable que pueda ver el texto que está ingresando como clave. Para esto se podría implementar un mecanismo que permita alternar entre un campo de clave convencional, presentado por defecto, y otro que revela el contenido de la clave, para confirmar que se ha escrito correctamente.

La imagen muestra el patrón de manejo de claves en sus dos estados: primero la clave aparece enmascarada con asteriscos, como un campo común de password. El segundo estado muestra el campo desenmascarado, con el texto legible. Al costado permanentemente aparece un botón que permite alternar ambos estados.
El modelo base es simple:
- Al presentar el formulario, por defecto se muestra un campo de clave estándar, con el contenido enmascarado, acompañado de un botón etiquetado
mostrar
o algo similar. - El usuario puede revelar el contenido del campo presionando el botón mostrar.
- El campo muestra el contenido de la clave en texto legible y cambia la etiqueta del botón a
ocultar
.
En términos de interacción todo va bien hasta acá, pero dependiendo de la técnica utilizada para cambiar las características del campo de clave, tendríamos que realizar un paso extra antes de enviarlo al servidor para procesarlo: si se utilizó JavaScript para alternar entre dos inputs, uno tipo password y otro tipo text, es necesario sincronizar el contenido de ambos antes de ejecutar el submit, e incluso, entre cada cambio de estado entre los dos campos porque el usuario pudo haber editado el texto. Por lo tanto, el flujo completo debería quedar del siguiente modo.
- Al presentar el formulario, por defecto se muestra un campo de clave estándar, con el contenido enmascarado, acompañado de un botón etiquetado
mostrar
o algo similar. - El usuario puede alternar el estado del campo entre enmascarado o descubierto
- El usuario hace visible el texto (desenmascara)
- Edita el contenido de la clave
- Se sincroniza el texto de los dos campos, el enmascarado y el descubierto
- Se repite el proceso tantas veces el usuario cambie de estado
- Usuario presiona el botón
submit. - Nos aseguramos de sincronizar el contenido de los campos.
- Se ejecuta el envío de los datos al servidor.
La verdad es que estoy considerando la implementación más compleja que implica usar dos campos y alternarlos mediante JavaScript, pero teóricamente debería ser posible alternar los estados simplemente cambiando el atributo type del elemento, con lo que se conservaría el valor y el ID del input, sin que sea necesario realizar ninguna sincronización. No lo he problado, pero lo haré pronto.
Por ahora, pueden probar el ejemplo que creé para esto. La implementación es sencilla y estándar y requiere de JavaScript y CSS. El ejemplo no separa el comportamiento del HTML, eso es el siguiente paso y lo haré en cuanto tenga un tiempo.
Si hay interés, puedo explicar en detalle la implementación del script del ejemplo. Espero sus comentarios.
2005-12-05: Actualicé y simplifiqué el ejemplo, la nueva versión la puedes encontrar en Patrón de Claves Simplificado.






1
Diego, Friday 2 de December, 2005, 13:37
Gran idea, en los sitios publicos que yo administro son muchas las veces que los usuarios ingresan mal sus contraseñas, y si no se provee algun mecanismo para recuperarla, es un problema…
Saludos!
2
CesarS, Friday 2 de December, 2005, 13:46
Lo que mencionas es una actitud bastante comun al registrarse en un sitio cualquiera, a mi se me ocurre que esto podria evitarse impidiendo que el usuario copie y pegue la contraseña al confirmarla (usando javascript)
En el peor de los casos si confirma una clave errada, el sistema deberia proveer la posibilidad de cambiarla usando la direccion de correo.
Es solo una idea :)
Saludos
3
nelson, Friday 2 de December, 2005, 13:54
Hola Cesar, el problema con bloquear la posibilidad de copiar vía JavaScript lo había pensado, pero veo que tiene dos problemas:
Mientras más lo pienso, más me gusta el patrón de alternar el modo de vista de la clave…
4
Pedro Fernandez, Friday 2 de December, 2005, 15:05
Muy buena explicación acerca de la idea y la discusión que se armó en clases el otro dia. Sin duda son puntos que no se tocan por ser demasiado “obvios” o triviales pero que significan una mejora significativa desde la perspectiva del Diseño de Interfaz y Accesibilidad.
A todo esto aun me rio acerca de Block o Inline haha. El problema es cuando tu novia no comprende porque demonios eso te causa risa. :(
5
el factor humano » Archivo » Patrón de Claves Simplificado, Monday 5 de December, 2005, 22:05
[…] Hace unos días publiqué una propuesta de manejo para el patrón estándar de claves en los formularios HTML. El ejemplo que mostré era una versión inicial de prueba y como comenté ahí, era susceptible de ser simplificado y mejorado. Efectivamente, acabo de publicar una versión mucho más simple que en lugar de hacer un complicado cambio y sincronización entre dos campos, uno tipo password y el otro tipo text, alterna el propio atributo type de un input. Esto tiene la ventaja de requerir menos operaciones, el código JavaScript es mucho más breve y simple y la mantención es menos compleja. […]
6
Rodrigo, Thursday 15 de December, 2005, 15:24
Tengo sentimientos encontrados. Por un lado creo que es bueno el hacer visible la clave en la parte de registro, favorece al usuario cuando registra su nueva cuenta.
La discrepancia la tengo al momento de autentificarse en un sitio. Pienso que la utilización de una máscara como la de los asterísticos esta bien.
El problema que tratas de solucionar esta mal identificado encuentro yo. Enfocas la solución de forma tal de adecuarse a una mala práctica de los “usuarios avanzados” (los usuarios nuevos, por lo general, tienen más paciencia en escribir más datos en el registro por ejemplo, ellos piensan que toda la información que se les solicita es relevante). Me pasó alguna vez eso de hacer copy-paste e introducir una clave usual que estaba mal escrita, pero el error es mío por tratar de ahorrar trabajo, quizás lo de no permitir hacer la copia de la contraseña a través de Javascript como menciona CesarS es una buen método. Pero escencialmente para este problema lo que hay que cambiar es la práctica de los usuarios y que éstos comprendan la importancia por ejemplo de introducir 2 veces la contraseña (más de alguno ni debe saber por qué se hace).
Hasta podría complicar al usuario el tener un botón junto al lugar en donde ingresa la contraseña, ya que es usual que en ese lugar se encuentre el botón “aceptar” o “ingresar”.
Claro que esto es sólo otro punto de vista también. Saludos.