security - tener - generador de contraseñas de facebook
¿Qué personajes harías inválido para una contraseña? (12)
Una situación hipotética: ha implementado un sistema de manejo de contraseñas y no impone ninguna limitación sobre qué caracteres se pueden usar. Desea establecer algunas reglas que sean un compromiso razonable entre dos cosas:
- Permita al usuario la mayor libertad posible.
- Tenga en cuenta la posibilidad de que pueda cambiar la forma en que maneja las contraseñas en el futuro; no desea descartar implementaciones razonables porque las contraseñas existentes de sus usuarios dejarán de ser válidas.
¿Qué reglas impondrías? ¿Hay otros factores que puedan afectar tu elección?
Cualquier personaje que no controle debería estar bien. Creo que los desarrolladores de sistemas de contraseñas súper-duper en el futuro permitirían caracteres ASCII "inusuales" como signos de puntuación y otras marcas, pero los personajes de control tienen el hábito de ser poco manejables para ingresar en shells de modo de texto e incluso en los cuadros de diálogo GUI que esperan Tab y Enter / Return para ser libre para sus propios fines.
Guardaría todo lo que pueda hacer con una tecla (y opcionalmente cambiar) en su teclado, excepto la pestaña. ¿Qué tipo de esquemas necesitarían una opción más restrictiva?
Haga que los usuarios escriban contraseñas que contengan al menos un número y un carácter no alfanumérico, y que tengan más de seis caracteres. De todos modos, creo que sean cuales sean las limitaciones, en el caso de que cambie la forma en que valida las contraseñas, debe notificar a los usuarios en un plazo razonable para actualizar la suya.
Las reglas que sugeriría hacer cumplir:
- Longitud: no menos de 8 caracteres, pero no más de 20
- Facilidad de interrupción: el pase no debe contener el nombre, el apellido o el nombre de usuario del usuario, ni (si es posible verificar) ninguna palabra que aparezca en el diccionario de inglés.
- Contenido: hay 4 tipos de caracteres en el teclado: mayúsculas, minúsculas, números y signos de puntuación. Una buena contraseña debe incluir representantes de al menos 3 grupos y no más de 2 o 3 caracteres del mismo grupo en una fila.
Lo mejor es que no haya restricciones, a menos que realmente puedas justificarlas.
Si usted es un banco, un proveedor de correo electrónico o si el usuario puede pedir algo sin proporcionar una tarjeta de crédito, entonces tiene sentido forzar a los usuarios a usar una contraseña segura. De lo contrario, lo estás haciendo difícil sin ningún motivo.
En cuanto a lo que debe almacenar, yo diría que 1024 caracteres de Unicode con caracteres de control prohibidos son todo lo que está justificado. Si el usuario no puede escribirlo, debería haber elegido una contraseña diferente. Todo lo que está almacenando es un hash, por lo que siempre puede cortarlo al tamaño que desee.
No impongas restricciones de ningún tipo. Y me parece que está planeando almacenar la contraseña, no el hash. No hagas eso tampoco. Más bien, almacene la combinación de sal y hash de contraseña y dicha sal.
Sin embargo, puede exigir a los usuarios que tengan una contraseña razonablemente fuerte al imponer restricciones de longitud (por ejemplo, no menos de 6 caracteres) y caracteres que contengan la contraseña (por ejemplo, debe contener caracteres alfabéticos en letras mayúsculas y minúsculas, uno o dos dígitos y varios caracteres no alfabéticos como ^ o #).
Un espacio en blanco (basado en la lógica que se puede recortar accidentalmente antes de ser hash)
En nuestra organización, si el usuario proporciona la contraseña, les permitimos usar lo que quieran.
Cuando los usuarios se inscriben por primera vez en el sistema, se genera una contraseña para ellos. Dado que esta contraseña generalmente se envía por correo a ellos, evitamos el uso de ciertos caracteres que podrían confundirse, especialmente cuando se usan ciertas fuentes. Por ejemplo, la letra O y el número 0 (cero) no se utilizan. Lo mismo para L, I y 1 (uno), S y 5, Z y 2 y otros.
Antes de realizar este cambio, recibimos muchas llamadas a nuestra mesa de ayuda porque los personajes nos confundían y no podían iniciar sesión.
Sin límite en la contraseña Si pueden escribirlo desde su teclado, independientemente del teclado regional que usen. Es posible que desee imponer una longitud mínima, opciones como al menos un número y un carácter especial, pero sin límite máximo.
En cuanto a tu segunda pregunta. La forma en que lo implementaría es creando campos separados a medida que mejora la fortaleza de las contraseñas. Por ejemplo, ahora tendría dos campos relacionados con la contraseña: salt, password_md5. Digamos luego que quieres usar sha256. Crea un nuevo campo llamado password_sha256. Cuando el usuario inicia sesión, primero verifique password_sha256. Si ese campo está vacío, verifique password_md5. Si eso coincide, ahora tiene la contraseña de texto sin formato que ingresó el usuario. A continuación, puede generar la contraseña sha256 (también restablecería la sal para una buena medida) y almacenar el nuevo valor. Luego, borraba el valor en password_md5 para que nadie pudiera revertirlo para obtener la contraseña.
Personalmente, simplemente voy con el mejor hash que tu lenguaje puede hacer y lo uso. Lo importante es aplicar una buena política de contraseña mínima, no importa cuán seguro es el hash cuando la contraseña es "1234", y sembrar el hash con un carácter aleatorio para evitar ataques de diccionario.
Personalmente, utilizo Fingerprint Keyboard de DigitalPersona (sí, Microsoft hace [o hizo] un dispositivo similar, ambos integrados o separados del teclado).
Esto permite la generación de contraseñas extremadamente largas y complicadas que no tienen que anotarse (ya que al presionar con el dedo en el lector, se ingresa la contraseña al diálogo de inicio de sesión [sistema / aplicación / sitio web]).
Esto, en mi opinión, ofrece lo mejor de ambos mundos: contraseñas extremadamente difíciles de "adivinar", sin tener que recordarlas. También simplifica la recomendación de seguridad adicional de usar diferentes contraseñas en diferentes sistemas.
Bueno, ese es el valor de mis dos centavos.
Personalmente, siempre he estado interesado en no aplicar demasiadas reglas.
Esto acaba de cambiar. Acabo de descubrir que mi sitio web es vulnerable a los ataques XSS. La solución es desinfectar cada pieza de entrada que proviene del usuario, incluida la contraseña.
Durante 10 años no hemos tenido límites en la contraseña. Ahora estamos implementando un límite para los caracteres que se pueden usar, y esto es simplemente para evitar que los hackers puedan acceder a Javascript o SQL. Entonces, construimos la siguiente lista:
Los caracteres válidos para una contraseña son: az AZ 0-9. ps % / (blanco)
Esto permite mucha flexibilidad, pero evita caracteres que podrían usarse para codificar un hack XSS, como; <> / {} [] + =? &,: ''"`
HTH
Algunas reglas a seguir:
- Evita los personajes de control. No es tan frecuente hoy en día, pero los personajes de control tienen significados especiales y algunas intercepciones de hardware controlan los personajes para realizar funciones especiales. Algunos causarán problemas de datos. El Control de ejemplo 0 (cero) generaría un nulo.
- ¿Vas a imponer restricciones de seguridad? Esta es una pregunta de interfaz de usuario, así como un problema de seguridad. ¿Cuál es su aplicación y su necesidad de seguridad? Muchos de los ejemplos dados anteriormente están desactualizados. Las tablas hash para combinaciones de contraseñas se publican con hasta 15 contraseñas de caracteres y las contraseñas de 16 caracteres pueden ser forzadas en minutos si la contraseña es débil o sigue un comportamiento humano típico. Comienza con un capital, termina con un número o carácter especial.
- Evitaría los caracteres comodín comunes, comillas, dos puntos, punto y coma, etc ... que se usan comúnmente en los lenguajes OS o DB.
- La autenticación de múltiples factores es una buena forma de hacerlo. No dependa solamente de la contraseña o no acepte contraseñas.