¿Cómo hash correctamente una clave? digesto grande vs pequeño

0

Tenemos que rodar (retirar) las claves de acceso a la base de datos a menudo, pero es importante saber qué clave está utilizando cada sistema para evitar eliminar una clave en uso, lo que crea indisponibilidad. Queremos que cada sistema informe qué clave está utilizando sin exponer la clave en sí, por supuesto.

Estamos usando claves generadas aleatoriamente con 512 bits de tamaño, y planeamos hacer un hash de esas claves y hacer que los hashes estén disponibles en un medio menos seguro.

Aquí viene el dilema: ¿Debemos usar un resumen grande o pequeño?

El tamaño mínimo de resumen sería de 32 bits. Solo necesitamos comparar un puñado de claves cada vez, por lo que está bien tener 1- (1 / (2 ^ 32)) de confianza (lo que da más del 99.99999%). Además, una eventual colisión retrasa un poco el desmantelamiento de las claves en colisión, por lo que es inofensivo.

Por supuesto, si el atacante ve el hash, puede filtrar todas las claves que no producen el mismo hash, reduciendo el espacio de búsqueda a 2 ^ (512-32), o 2 ^ 480, lo que consideramos suficientemente seguro.

Sin embargo, algunos colegas sugirieron que un pequeño resumen es susceptible a las tablas del arco iris y otros ataques, por lo que deberíamos usar un resumen completo de SHA-256 o SHA-512. Eso me suena extraño, porque si nuestra clave es de 512 bits, un hash SHA-512 no generaría ninguna colisión y el atacante solo tendría que encontrar la clave que produce el mismo hash. Todo este procesamiento se puede hacer fuera de línea, sin acceso a la base de datos para probar las claves. Así que parece más peligroso que usar un resumen de 32 bits.

¿Cómo podemos resolver esto?

    
pregunta fernacolo 02.05.2016 - 21:01
fuente

2 respuestas

1

En su caso de uso específico, esta afirmación es defectuosa:

  

... sugirió que un pequeño resumen es susceptible a las tablas de arco iris y otros ataques ...

Una tabla de arco iris es solo una tabla de búsqueda de valores de resumen precalculados. Piense en el uso de un hash como el índice al final de un libro, que le indica qué número de página debe leer para encontrar el contexto real que contiene esa palabra. Al igual que un libro, el mismo número de página puede indexar muchas palabras diferentes: llamamos a estas colisiones. Con un algoritmo hash, el tamaño de la página no está limitado como una página de libro, por lo que es posible un número infinito de colisiones. En ese caso, saber el número de página no te dice cuál de las infinitas colisiones posibles es realmente tu clave, por lo que le revela poco al atacante.

Considere el caso absurdo en el que colapsa la longitud de su resumen hasta solo dos bits; con solo cuatro valores posibles, verá que saber el valor de resumen de 0, 1, 2 o 3 no le dice cuál es la clave. Es por eso que una tabla de arco iris no ayuda al atacante.

La razón por la que las tablas arcoiris son útiles para los atacantes es que algunos sistemas solo almacenan valores de resumen en lugar de contraseñas. (El antiguo sistema LANMAN de Microsoft hizo esto de manera infame almacenando los hashes de las contraseñas de 7 caracteres). En esos sistemas, conocer cualquier contraseña que genere el hash deseado permitiría al atacante recrear el valor del hash y obtener la entrada. Pero en su caso, saber el valor del resumen no revela cuál de las colisiones es la clave real; el simple hecho de saber el valor del resumen no proporciona al atacante acceso.

Saber el valor del resumen proporciona al atacante la capacidad de reducir el número de claves que intenta adivinar, pero con 2 ^ 512 para elegir, la reducción de 2 ^ 32 posibilidades no reduce su espacio de búsqueda a rango de adivinación factible, que en la práctica probablemente sería menor que 2 ^ 80. En realidad, usted frustra más al atacante proporcionando una longitud de resumen más corta, ya que reduce su capacidad para limitar su espacio de búsqueda.

Debe elegir una longitud de resumen que le brinde una confianza aceptable en que no confundirá un resumen de clave legítimo con otro. Eso es todo de lo que tienes que preocuparte.

    
respondido por el John Deters 02.05.2016 - 23:23
fuente
2

En la práctica, literalmente no importa.

Si el tamaño de su clave es de 512 bits (no estoy seguro de qué cifrado está usando, ya que ninguno de los que conozco usa claves de 512 bits, pero sí lo que sea), tiene dos escenarios:

  • En un pequeño resumen tienes tantas colisiones que descubrir la clave original al buscar valores coincidentes te dará una gran cantidad de resultados. Por no hablar de intentar ejecutar cualquier algoritmo de cómputo remoto 2 veces 512 , o incluso 2 veces 256 , es prácticamente imposible.
  • En un resumen grande tienes menos colisiones (un hash SHA-512 de todos los valores en el espacio de 512 bits producirá, con toda probabilidad, una serie de colisiones, es realmente muy difícil de demostrar ) pero una función hash mucho más lenta. Nuevamente, con un espacio de entrada de 2 512 o 2 256 es prácticamente imposible la fuerza bruta.

Hay muchos pensamientos incorrectos en ambos lados de tu argumento, sin embargo:

  • Forzar brutalmente un único valor de 256 bits en una computadora convencional requeriría más energía de la que podemos observar en el universo conocido debido a Principio de Landauer . Puede encontrar más contexto sobre esto en una publicación en el blog de Bruce Schneier . Un valor de 512 bits es aún más ridículo: simplemente no sucederá, incluso si tiene una implementación eficiente de Grover's algoritmo en una computadora cuántica increíblemente avanzada.
  • Las tablas de arco iris no son útiles en este tipo de ataque. La idea de una tabla de arco iris es enumerar todos los valores de entrada posibles antes de tiempo para una función hash conocida, y almacenar los plaintexts y hashes en una cadena. Esto hace que sea muy fácil realizar búsquedas contra un hash y obtener el valor original. Sin embargo, esto solo es factible para espacios de entrada de tamaño sensato, por ejemplo. contraseñas Con un espacio de entrada de 512 bits, su número de estados es tan grande que almacenar incluso un hash de 8 bits para cada valor de entrada requeriría 2 bytes 512 (es decir, 1.190853 × 10 139 petabytes) de almacenamiento. Incluso si pudieras calcular de alguna manera todos esos hashes (de nuevo el principio de Landauer) necesitarías almacenarlos en algún lugar. Incluso si pudieras almacenar un byte completo, de alguna manera, en cada fotón en el universo conocido, no tendrías lo suficiente, solo unos 10 50 de hecho.

En general, solo elija un hash criptográfico fuerte como SHA-256 y no se preocupe por eso.

    
respondido por el Polynomial 02.05.2016 - 21:27
fuente

Lea otras preguntas en las etiquetas