¿Cuánto tiempo deben tener los códigos de autenticación de 2 factores?

16

Me he dado cuenta de que muchos servicios que ofrecen autenticación de 2 factores han pasado de usar cuatro dígitos a seis. Sin embargo, me parece contraproducente porque los dígitos son aleatorios, los dígitos (deben) caducan y, con seis dígitos, es posible que tenga que mirar su teléfono dos veces o más

¿Hay alguna razón para esto, más allá de que parezca más seguro? Mi preferencia sería de cuatro o incluso tres dígitos, ya que son más fáciles de recordar y volver a ingresar.

    
pregunta Max Savin 21.08.2017 - 20:49
fuente

2 respuestas

19

Sí, hay una razón: para reducir los ataques de adivinación por fuerza bruta contra varias cuentas.

Todas las implementaciones de 2FA incluyen un componente en línea que impone un conjunto limitado de reintentos, asegurando que la cuenta esté bloqueada mucho antes de que un atacante pueda probar todos los códigos de acceso posibles. La longitud del código de acceso 2FA establece la probabilidad de que un actor malintencionado adivine la autenticación en el número dado de intentos permitidos. Por ejemplo, si el código de acceso de 2FA tiene una longitud de 3 dígitos y se le dan 3 intentos para ingresarlo, las posibilidades de adivinarlo aleatoriamente son 3/1000 o 0.33%. Si el código de acceso 2FA tiene 4 dígitos, las posibilidades bajan a 3/10000, o 0.033%.

Si bien esta es una probabilidad muy baja de que adivine su código de acceso específico, imagine un atacante con una base de datos de 10,000 cuentas robadas de algún servidor. Al atacar solo a una cuenta de usuario, solo tiene un 0.33% de probabilidad de adivinarlo, pero después de adivinar tres veces en 509 cuentas diferentes, la probabilidad de que adivine con éxito una es de 0.5 o 50%. Para cuando haya bloqueado 2,009 cuentas, la probabilidad de que haya acertado al menos un código de acceso válido es .99, o 99%. * Considere que el atacante puede no necesitar atacar con éxito todas las cuentas para obtener acceso; puede que solo necesite una. éxito para iniciar sesión en el sitio y establecer un punto de apoyo.

Tradicionalmente, la detección de un ataque de fuerza bruta se basaba en reconocer que el atacante intentaba varias solicitudes rápidamente con un script automatizado. Una dirección IP que sea responsable de tres o diez cuentas bloqueadas en una fila podría generar una alerta. Pero los atacantes modernos saben que al proceder lentamente pueden evitar la detección; Los recientes ataques avanzados han demostrado esta técnica en la naturaleza. Considera a un atacante usando una botnet de 10,000 computadoras zombie. Él puede ordenarles que lancen lentamente una solicitud aleatoria cada pocos minutos desde las 10,000 direcciones IP sin tener que activar una alerta de velocidad o bloquear cualquier cuenta. Es solo cuestión de tiempo antes de que tenga éxito.

Dado que la detección de este ataque es prácticamente imposible, las únicas protecciones que quedan son hacer que sea más difícil para el atacante, por lo que deben reducirse las probabilidades de adivinar correctamente un código de acceso. Las dos formas de hacerlo son aumentar la longitud mínima de un código de acceso (a 6 u 8 dígitos) o reducir la cantidad de intentos de código de acceso no válidos permitidos. Dado que reducir el número de conjeturas afectaría la facilidad de uso para los usuarios legítimos, los diseñadores de algoritmos no tienen más remedio que aumentar la longitud de cada código de acceso.

* Mis habilidades matemáticas no son excelentes, por lo que estos números pueden estar desactivados. Algunos editores con inclinaciones matemáticas deberían sentirse libres de editar esta respuesta para incluir la prueba utilizando correctamente la fórmula de Bernoulli.

    
respondido por el John Deters 21.08.2017 - 22:04
fuente
3

La respuesta de John Deters explica por qué usar más dígitos para los códigos 2FA es bueno, pero no lo ha hecho. Mostró las matemáticas. Además, invita a los lectores a revisar sus cálculos, y creo que hay algunos errores. Quería hacer una edición, pero me di cuenta de que sería demasiado tiempo. Así que estoy publicando esto como una respuesta separada; si hay consenso en que mis cálculos son correctos, podemos editar su respuesta (o él puede hacerlo él mismo).

El objetivo es calcular cuántos intentos necesita un atacante para adivinar un código 2FA de una longitud determinada. El atacante tiene éxito si, haciendo varios intentos, puede adivinar al menos uno. "Al menos 1" es difícil de calcular directamente, así que vamos a usar un truco:

P(at least one code is guessed) = 1 - P(no codes are guessed)

Ahora, de la fórmula binomial , la probabilidad de obtener exactamente k=0 successes en n trial es simplemente

(1-p)^n

entonces

P(at least one code is guessed) = 1 - (1-p)^n

Entonces, para un p=3/1000 dado (3 intentos antes de que la cuenta se bloquee, donde el total de códigos de 3 dígitos posibles son 1000), ¿cuál es el número de intentos n que un atacante necesita para tener una probabilidad de éxito? mayor del 50%?

P(at least one code is guessed) > 50%
1 - (1-p)^n > 50%
(1-p)^n < (1 - 50%)

(Lo dejo como 1 - 50% , en lugar de reemplazarlo con el resultado 1/2, porque al final repetiremos el cálculo para tener una probabilidad del 99%, y en ese caso lo quiero para que quede claro que no tenemos que escribir 0.99, sino 0.01. Podría haber dejado una variable allí, como desired_success_probability , pero pensé que sería menos legible)

Ahora, para extraer n , vamos a llevar el logaritmo a la base (1-p) de ambos miembros. Dado que la base es menor que 1, y la función logarítmica para una base menor que 1 es disminuyendo monotónicamente , tenemos para invertir la desigualdad , por lo que obtenemos:

n > log (1-p) (1 - 50%)

y cambiando la base a una conveniente (por ejemplo, 10 o e -  todo vale, siempre que la calculadora lo soporte) tenemos la solución:

n > log(1-50%) / log(1-p)

que para p = 3/1000 es

n > 230.7, that is, n >= 231.

Entonces, si la probabilidad de adivinar un código es 3/1000, después de 231 intentos, tenemos que adivinar que al menos uno es más probable que adivinar ninguno.

Si, en lugar de tener una probabilidad de éxito del 50%, el atacante desea alcanzar el 99%, necesita

n > log(1-99%) / log(1-p)

que significa

n > 1532.75, that is, n >= 1533

Y si el atacante puede hacer 3 intentos por cuenta antes de que se bloquee, significa que solo necesita 77 cuentas en su base de datos robada para tener una probabilidad de más del 50% de dividirse en una, o 511 para tener más de 99%.

¿Qué sucede si el código 2FA tiene, en cambio, 6 dígitos? La probabilidad de éxito para un solo intento se convierte en p = 3/1,000,000 , lo que significa que el atacante necesita al menos 231,049 intentos (77017 cuentas) para tener un 50% de probabilidad de éxito. Si quiere tener un 99% de posibilidades de éxito, necesita 1,535,055 intentos (511,685 cuentas).

En resumen, al agregar 3 dígitos estamos aumentando el número de códigos posibles en un factor de 1000, y para mantener la misma probabilidad de éxito, el atacante debe hacer un poco más de 1000 veces más intentos. Si estas son cuentas bancarias en línea, ¿vale la pena gastar de 1 a 2 segundos más para ingresar el código y hacer que la vida de un ladrón sea 1000 veces más difícil? En mi opinión, absolutamente.

    
respondido por el Fabio Turati 23.08.2017 - 02:17
fuente

Lea otras preguntas en las etiquetas