En general, no, no puede usar un esquema de este tipo con un almacenamiento basado en hashing y aún así esperar el mismo tipo de seguridad que con el hashing de contraseña completa que normalmente se practica.
Aquí está la demostración: el punto de almacenamiento de la contraseña hashed , y no la contraseña de texto sin formato, es que simplemente asume que los atacantes pueden obtener un vistazo (posiblemente de solo lectura) del contenido del servidor. (por ejemplo, con una cinta de copia de seguridad robada). Con esa copia, el atacante puede emular el comportamiento del servidor en sus propias máquinas.
En particular, el atacante puede:
- Inicia su emulación del servidor.
- Comience un procedimiento de autenticación con ese servidor emulado. El servidor solicita, digamos, las letras 1, 5 y 8 de la contraseña del usuario.
- El atacante instantáneas del estado del servidor emulado completo en ese momento.
- Para cada combinación posible de tres letras, el atacante reinicia el servidor emulado en el punto de la instantánea, ingresa las tres letras y ve si el servidor emulado está contento o no.
- Una vez que el atacante haya encontrado la combinación correcta de tres letras (solo hay 26 × 26 × 26 = 17576 combinaciones de tres letras, lo que es realmente muy poco para un atacante automático que puede hacer las cosas por millón; recuerde que todos De esto sucede en el servidor emulated , en las propias máquinas del atacante), puede comenzar de nuevo en el paso 1, para adivinar otras letras. Después de algunas iteraciones, el atacante tiene la contraseña completa del usuario y puede iniciar sesión con confianza en el servidor real .
En la práctica, el atacante no necesita configurar realmente una máquina virtual completa con instantáneas; Simplemente puede concentrarse en los pocos kilobytes de código que manejan el proceso de autenticación. Pero basar la descripción en las instantáneas y en la emulación del servidor muestra que este tipo de ataque es genérico, y no hay nada que se pueda hacer para protegerse contra él mientras se aplique el modelo de ataque.
Para lograr nuevamente la seguridad, entonces, el modelo debe hacerse para que no se aplique. En la discusión anterior, asumo que el atacante puede obtener una copia del estado del servidor. Por lo tanto, para evitar ese ataque, debemos hacerlo de modo que haya al menos una parte del estado del servidor que el atacante no pueda saquear. En ese caso, solo almacene una clave simétrica K en esa parte del servidor libre de atacantes, y use el cifrado simétrico para almacenar las contraseñas.
Espero que la mayoría de los sitios que solicitan combinaciones de letras dentro de la contraseña del usuario utilicen dicho cifrado reversible. Esto puede considerarse "seguro" si la clave K se mantiene fuera del alcance de los atacantes, lo cual es difícil a menos que hacerlo seriamente (y costoso).
En general, pedir tres letras significa que otorga entrada a atacantes aleatorios con probabilidad 1/17576, lo que, en mi opinión, es un poco demasiado alto para la comodidad, teniendo en cuenta que estamos hablando de un servidor accesible públicamente. . Todo el concepto de pedir solo algunas letras es "más seguro", pero en realidad se trata más bien de rociar algunos elementos rituales molestos para que pueda sentirse más seguro, posiblemente a expensas de seguridad.