Las operaciones de inserción, búsqueda y eliminación en tablas hash tienen el peor comportamiento de O (n). Si un atacante puede elegir claves para ser insertadas en una tabla hash y pueden computar la función hash, entonces eso crea una oportunidad para la denegación de servicio. Todo lo que deben hacer es elegir las claves que se asignan al mismo grupo.
La cita sugiere que el uso de un algoritmo de hash criptográfico (SHA, MD5, Blake, Skein, etc.) resuelve el problema. Esa interpretación es totalmente incorrecta . El algoritmo que utiliza HashMap de Rust se llama SipHash . Es un algoritmo hash. Y es un algoritmo criptográfico. Pero no es una cryptographic-hash-function . El término correcto para SipHash en el mundo de la criptografía es PRF .
La diferencia clave es que (en la criptografía) todos los detalles de una función hash pueden ser de conocimiento público. Un PRF, por otro lado, requiere una clave secreta. Sin la información secreta, no hay forma de anticipar, para ninguna entrada, cuál será la salida. (Todos los demás detalles son públicos.)
Algo como SHA-2 no evitará la denegación de servicio. Será totalmente imparcial para insumos no adversarios. (Debido a que las funciones criptográficas de hash pueden modelarse como oracles aleatorios .) Sin embargo, cualquier persona puede evaluar SHA-2 sin formato, para que alguien pueda encontrar Colisiones en tabla hash por fuerza bruta.
El hecho de que una función hash criptográfica sea resistente a la colisión (con una salida de al menos 256 bits) no se traduce en una falta de colisiones en el caso de las tablas hash. En última instancia, su función hash, para una tabla con cubos n , se reducirá a uno de los valores posibles de n . Por prueba y error, puede encontrar una entrada que se asigna a un grupo específico aproximadamente una vez cada n intentos. Ninguna tabla hash usa suficientes cubos para hacer esto imposible.
El uso de una función hash sin clave es inherentemente vulnerable a la denegación de servicio, sin importar qué tan buena sea la función hash. El hecho de que el atacante y el servidor-con-hash-mapa consulten el mismo oracle permite a un DOSer usar entradas específicamente elegidas para amarrar su CPU.
Los PRF como SipHash no tienen esta vulnerabilidad si se usan correctamente. El servidor utiliza una función / oracle elegida de un grupo de 2 128 posibles funciones. Para explotar una función hash basada en PRF (hash-table-), el atacante debe adivinar cuál de las 2 funciones 128 debería usar (una "recuperación de clave") o encontrar un sesgo en el PRF independiente de la clave (una forma de distinguir el PRF de un oráculo aleatorio).
Finalmente, existen matices más confusos que involucran algoritmos hash. Pero resumido simplemente:
- Las funciones hash criptográficas son un subconjunto de todas las funciones hash ordinarias
- Bajo la definición clásica de función hash criptográfica, no se requiere aleatoriedad. Sin embargo, la aleatoriedad es una característica de todas las funciones hash criptográficas de gran nombre de todos modos.
- No todas las PRF son funciones hash criptográficas
- No todas las funciones hash criptográficas son PRF
- Un algoritmo puede tener las propiedades de un PRF y una función criptográfica de hash.
- Blake2, Skein y KMAC tienen ambos conjuntos de propiedades
- Las familias SHA-2 y SHA-3 son ejemplos de funciones hash criptográficas (sin clave)
- SipHash es solo un PRF (y una función hash ordinaria, pero no criptográfica)
- Un PRF se puede construir utilizando funciones hash criptográficas típicas, pero la función hash en sí no es necesariamente un PRF.
- El "hashing aleatorio" y el "hashing universal" son similares a los PRF en algunos aspectos, pero no tienen los mismos requisitos de seguridad.