Usando el índice de caracteres en una pregunta de seguridad [duplicado]

1

Estoy viendo muchos sitios que ofrecen una o dos "preguntas de seguridad" que deben responderse seleccionando caracteres en índices específicos, además del nombre de usuario y la contraseña. Por ejemplo:

"¿Cuál es el apellido de soltera de tu madre?"
1:[] 5:[] 8:[]

Y debes ingresar los caracteres primero, quinto y octavo de la respuesta que configuraste.

Ahora, ignorando el hecho de que realmente no está agregando otro factor (aún es lo que sabe, no lo que tiene, etc.), e ingeniería social, etc., ¿hay una manera de almacenar de forma segura el lado del servidor de información en un hash? Formato, y aún proporcionar la funcionalidad?

En otras palabras, diga que una respuesta de seguridad es "smith". Quiero poder almacenar eso en algún formato de hash, de modo que cuando el usuario ingrese su primer, tercer y cuarto caracteres, pueda verificar si coincide. No quiero almacenar cifrado "smith". Quiero poder tomar el valor de hash de "smith" y la entrada del usuario y decir "sí, está bien" o "no, lo entendiste mal". es posible? ¿Qué algoritmo (s) funcionan bien para esto?

Lo pregunto, porque la aplicación móvil de mi banco ha comenzado a usar esto para iniciar sesión, y parece que no puedo entender cómo se puede lograr esto sin poder recuperar "smith" del valor almacenado.

    
pregunta ashic 23.07.2015 - 19:14
fuente

1 respuesta

3

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:

  1. Inicia su emulación del servidor.
  2. 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.
  3. El atacante instantáneas del estado del servidor emulado completo en ese momento.
  4. 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.
  5. 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.

    
respondido por el Thomas Pornin 23.07.2015 - 20:14
fuente

Lea otras preguntas en las etiquetas