Recuento de iteraciones especificadas por el usuario

2

Estoy trabajando en un sistema de registro y autenticación de PHP siguiendo el estándar salt + password = 'auth hash' y usando el nombre de usuario de texto simple / sin cifrar como el campo de búsqueda en la consulta inicial. Para el propósito de esta pregunta, supongamos que también estoy usando un chile global (es probable que agregue uno antes de terminar, así que supongamos que ya lo he hecho).

Algo me pareció un concepto quizás interesante. Me doy cuenta de que dicen " no reinventar la rueda cuando se trata de seguridad ", pero estaba considerando permitir un número de iteraciones 'especificadas por el usuario' para PBKDF2.

Ahora, no quiero decir que el usuario tenga control sobre el número de iteraciones, sino que se genera un número aleatorio entre X e Y en tiempo de ejecución y luego ese valor se almacena, en texto plano, como un campo separado en La base de datos de la misma manera que almacenaría la sal. Entiendo que el algoritmo ya se considera extremadamente seguro y sencillo de implementar, pero creo que una "capa" adicional dificultaría aún más la tarea de un atacante.

En aras de la simplicidad (y la continuidad con el uso de alimentos), llamemos "salsa" al recuento de iteraciones aleatorias. Como ejemplo;

  • Pepper ya está en DB y se recupera a una variable
  • El usuario se registra con nombre de usuario y contraseña
  • Se genera sal
  • La salsa se genera y debe estar entre 16000 y 32000 iteraciones ( números teóricos )
  • El hash se genera a partir de sal + contraseña + salsa + pimienta
  • El nombre de usuario, el hash, la sal y la salsa se almacenan en el DB

Dado que 'salsa' se almacena como texto simple, su propio algoritmo sería adaptable basado en lo que está almacenado en la base de datos (al igual que con sal), e incluso más al punto, elegir un número entre X e Y generalmente es bastante rápido.

Nuevamente, no me preocupa que un atacante pueda romper una clave de salida de 512 bits de hash SHA512 que haya pasado por 32000 iteraciones (número de ejemplo) y tenga sal y pimienta dentro de un período de tiempo razonable, y ciertamente no podrían No generes una mesa de arcoiris contra ella. Estoy más interesado en la posibilidad de que podamos ampliar el diseño aún más, con relativa facilidad, con muy pocos gastos generales adicionales en el lado de los "defensores", pero agregando más gastos generales al lado de los atacantes, lo que puede disuadirlos por completo y sin necesidad de adaptarse el propio algoritmo de hash.

Usted establece sus propios conteos de iteraciones mínimas y máximas dentro del rango de lo que su entorno puede manejar y, por lo tanto, aún mantiene un control significativo sobre la seguridad relativa del sistema, y nunca permite que sus usuarios finales especifiquen su propio valor (para el rendimiento razones, y por la razón es probable que seleccionen algo memorable anulando completamente su paso adicional, y por hacer un buen UX). En entornos donde la seguridad es de suma importancia, seguramente tener estos pequeños pasos adicionales en el camino funcionaría en beneficio de los defensores.

¿Tener este nivel adicional no proporcionaría otro aro para que un atacante lo atraviese? ¿Pensamientos?

    
pregunta Scott Pritchard 07.06.2013 - 21:47
fuente

3 respuestas

3

La salsa no es un aro extra. El atacante no obtiene ningún beneficio al conocer la salsa de antemano. La sal le impide hacer precomputaciones útiles de todos modos.

El recuento de iteraciones óptimo se determina a partir de un compromiso entre su potencia de cómputo disponible y la potencia de cómputo disponible para un atacante típico. Claro, es difícil cuantificarlo de manera precisa, pero no obstante, la aleatorización solo puede hacer que el valor resultante sea menos óptimo.

Si el atacante quiere posicionarse en la organización y no le importa mucho qué cuenta infringe, es probable que las cuentas con el nivel más bajo caigan primero (aunque la complejidad de la contraseña tendrá más influencia). La aleatorización duele más de lo que ayuda en este escenario, ya que debilita el eslabón más débil sin una compensación proporcional por el tiempo de procesamiento ganado.

Tu salsa aleatoria es una complejidad extra, incluso si es solo un poco. La complejidad es el enemigo de la seguridad, es una cosa más que podría equivocarse accidentalmente (por ejemplo, una salsa mínima demasiado baja).

En conclusión, recomiendo un recuento de iteraciones fijo, cambiando de vez en cuando a medida que los procesadores se vuelven más potentes.

    
respondido por el Gilles 07.06.2013 - 22:06
fuente
2

En el escenario:

  • Tengo sus contraseñas, hash
  • Usas sal, de la manera correcta, por lo que no tengo uso para mis tablas de arco iris pre-computadas
  • Tendré que usar fuerza bruta con la sal que ya tengo, y pimienta y salsa ...

Bueno, primero que nada, solo tengo que traer mi propia ensalada, porque los condimentos los doy :)

En segundo lugar, tendré el número de iteraciones, ya que lo tienes como la sal, eso no es ese secreto.

Pero incluso si no lo tengo, tendré que calcular todas esas iteraciones. Si sé que serán de 16,000 a 32,000, simplemente probaré mi resultado después del 16,000. Por su esquema, en lugar de tener que iterar hasta 32,000, tal vez tenga suerte y obtenga el resultado antes de eso. No sé si probarlo tomará más poder de cómputo que calcular cada nueva iteración, así que quizás valga la pena intentarlo ...

Y, finalmente, tablas de arco iris son una forma de optimizar los valores precalculados, no es una tabla de búsqueda simple .

    
respondido por el woliveirajr 07.06.2013 - 22:05
fuente
2

Desea que su recuento de iteraciones sea tan alto como pueda tolerar, dado el rendimiento de su sistema y la sobrecarga de cómputo esperada que esto agrega a su proceso de autorización, y definitivamente no es algo que sea ajustable de una manera por usuario . Además, tendrá que mantener este valor en algún lugar, lo que significa que no se puede considerar un secreto, por lo que ya no está ralentizando ni deteniendo al posible atacante, simplemente está brindando la posibilidad de que pueda hacerlo. termine su tarea de forzar hashes individuales de forma bruta más rápido que con el número máximo de iteraciones con las que puede vivir.

Oh, ¿y por qué no se puede mantener en secreto su iteración? Bueno, simple. Incluso si usó algún esquema realmente inventivo para proteger ese valor, lo usará más adelante, y diferentes valores de iteración resultarán en una sobrecarga de cómputo diferente, algo que un atacante puede verificar con lo que se llama ataques de tiempo . Un atacante podría usar incluso su sistema en vivo para determinar con una precisión relativamente buena el recuento de iteraciones utilizado para cada cuenta.

    
respondido por el TildalWave 07.06.2013 - 22:12
fuente

Lea otras preguntas en las etiquetas