El principal problema al usar solo la contraseña es que no puede aplicar sales .
En un servidor normal y robusto que autentica a los usuarios con una contraseña, las contraseñas en sí mismas no se almacenan "como están", sino que hash . El proceso de hashing de contraseña requiere algo de cuidado, ya que un atacante que obtiene una copia de ese archivo lleno de contraseñas hash (por ejemplo, a través de un ataque de inyección SQL) puede ejecutar un ataque del diccionario : esto es" intentar "contraseñas potenciales. Los usuarios humanos tienden a elegir contraseñas que son "palabras" en algún idioma, o derivadas simples de eso (por ejemplo, agregando un dígito), de ahí el término "diccionario".
Para hacer la tarea más difícil para el atacante, el proceso de hashing de contraseña debe:
- ser inherentemente lento al ordenar, por ejemplo, un millón de invocaciones de funciones hash anidadas;
- be salted : la sal es un parámetro que altera la forma en que funciona el hash, y cada contraseña de hash tiene su propio valor de sal. De esta manera, cuando el atacante intenta una contraseña potencial, primero debe elegir la contraseña con hash a la que se dirigirá.
El nombre de usuario es el selector para el salt: cuando el servidor recibe el nombre de usuario, lo busca en su base de datos, obteniendo la contraseña con hash y el valor de sal que se utilizó para calcular ese hash ( ambos se almacenan juntos). Esto le permite al servidor volver a calcular el hash, comenzando con el valor de sal que y la contraseña que proporcionó el usuario. Si el servidor obtiene el mismo valor de hash que el que se almacenó, el usuario se autentica; De lo contrario, el usuario es rechazado. "Buenos algoritmos para eso son bcrypt y PBKDF2 . Prefiero bcrypt ( pero PBKDF2 no es malo).
Sin nombre de usuario, sin sal. El servidor no puede saber qué valor de sal usar para la contraseña específica, por lo tanto, debe usar la misma sal (es decir, sin sal) para todas las contraseñas almacenadas. Esto permite a los atacantes atacar todas las contraseñas a la vez, lo que es mucho más eficiente.
Es más simple de ver si piensa en un ataque de diccionario en línea , donde el atacante intenta posibles contraseñas en su servidor. Con un nombre de usuario + contraseña, el atacante debe enviar un nombre de usuario y una contraseña, y tiene éxito si el usuario con ese nombre realmente tiene esa contraseña . Sin el nombre de usuario, el atacante simplemente envía una contraseña potencial y tiene éxito si cualquier usuario en el sistema tiene esa contraseña. Si tienes 1000 usuarios, simplificaste el ataque 1000 veces.
Además, cuando un nuevo usuario se registra, elige su contraseña. Si esa contraseña choca con la de otro usuario, no tiene más remedio que rechazar el registro. En ese momento, el nuevo usuario acaba de enterarse de que la contraseña que quería usar es ya una contraseña válida para otro usuario: acaba de convertir al nuevo usuario en un atacante exitoso, y él lo sabe ... .
De acuerdo, debo recordar que no debe responder la pregunta después de comer, pero antes del café. Acabo de darme cuenta de que sus "contraseñas" son en realidad UUID con 122 bits de entropía generada aleatoriamente. En ese caso, las cosas serán mejores. No llamaríamos a estas UUID "contraseñas", ya que no son "palabras" y tampoco son elegidas por un humano, ni siquiera recordadas por un humano. Estos son tokens de autenticación .
Aún querrá hacer sus transacciones sobre SSL. Además, dado que los clientes no los recordarán , los escribirán, en archivos o en papel (más probablemente los archivos, para que puedan cortarlos y pegarlos, nadie quiere escribir el UUID completo en una base regular). Esto hace que el secreto de estos UUID sea más difícil de mantener. Sus clientes deberán asumir la responsabilidad de mantener estos valores en secreto; esto podría ser demasiado pedirle a un cliente típico.