stringtranslate.com

SipHash

SipHash es una familia de funciones pseudoaleatorias basada en add-rotate-xor (ARX) creada por Jean-Philippe Aumasson y Daniel J. Bernstein en 2012, [1] : 165  [2] en respuesta a una serie de ataques de denegación de servicio de "inundación de hash" (HashDoS) a fines de 2011. [3]

SipHash está diseñado como una función hash no criptográfica . Aunque se puede utilizar para garantizar la seguridad, SipHash es fundamentalmente diferente de las funciones hash criptográficas como los algoritmos hash seguros (SHA) en que solo es adecuado como un código de autenticación de mensajes : un código de autenticación de mensajes hash con clave similar a una función hash ( HMAC ). Es decir, SHA está diseñado para que sea difícil para un atacante encontrar dos mensajes X e Y tales que SHA( X ) = SHA( Y ), aunque cualquiera pueda calcular SHA( X ). SipHash, en cambio, garantiza que, habiendo visto X i y SipHash( X i , k ), un atacante que no conoce la clave k no puede encontrar (ninguna información sobre) k o SipHash( Y , k ) para ningún mensaje Y ∉ { X i } que no haya visto antes.

Descripción general

SipHash calcula un código de autenticación de mensajes de 64 bits a partir de un mensaje de longitud variable y una clave secreta de 128 bits. Fue diseñado para ser eficiente incluso para entradas cortas, con un rendimiento comparable al de las funciones hash no criptográficas, como CityHash ; [4] : 496  [2] esto se puede utilizar para evitar ataques de denegación de servicio contra tablas hash ("hash flooding"), [5] o para autenticar paquetes de red . Más tarde se agregó una variante que produce un resultado de 128 bits. [6]

Una función hash sin clave, como SHA, es resistente a colisiones solo si se utiliza toda la salida. Si se utiliza para generar una salida pequeña , como un índice en una tabla hash de tamaño práctico, entonces ningún algoritmo puede evitar colisiones; un atacante solo necesita hacer tantos intentos como posibles salidas.

Por ejemplo, supongamos que un servidor de red está diseñado para poder gestionar hasta un millón de solicitudes a la vez. Lleva un registro de las solicitudes entrantes en una tabla hash con dos millones de entradas, utilizando una función hash para asignar la información de identificación de cada solicitud a una de las dos millones de entradas posibles de la tabla. Un atacante que conozca la función hash sólo tiene que introducirle entradas arbitrarias; una de cada dos millones tendrá un valor hash específico. Si el atacante envía ahora unos cientos de solicitudes, todas elegidas para tener el mismo valor hash al servidor, eso producirá una gran cantidad de colisiones hash, ralentizando (o posiblemente deteniendo) el servidor con un efecto similar a una inundación de paquetes de muchos millones de solicitudes. [7]

Al utilizar una clave desconocida para el atacante, una función hash con clave como SipHash evita este tipo de ataque. Si bien es posible agregar una clave a una función hash sin clave ( HMAC es una técnica popular), SipHash es mucho más eficiente.

Las funciones de la familia SipHash se especifican como SipHash- c - d , donde c es el número de rondas por bloque de mensaje y d es el número de rondas de finalización. Los parámetros recomendados son SipHash-2-4 para un mejor rendimiento y SipHash-4-8 para una seguridad conservadora. Algunos lenguajes utilizan Siphash-1-3 para un mejor rendimiento a riesgo de ataques DoS aún desconocidos. [8]

La implementación de referencia se publicó como software de dominio público bajo la licencia CC0 . [6]

Uso

SipHash se utiliza en implementaciones de tablas hash de varios programas: [9]

Los siguientes programas utilizan SipHash de otras maneras:

Implementaciones

Véase también

Referencias

  1. ^ Dobraunig, Christoph; Mendel, Florian; Schläffer, Martin (29 de noviembre de 2014). "Criptoanálisis diferencial de SipHash". Áreas seleccionadas en criptografía -- SAC 2014. Apuntes de clase en informática. Vol. 8781. págs. 165–182. doi :10.1007/978-3-319-13051-4_10. ISBN 978-3-319-13050-7. Recuperado el 28 de febrero de 2018 .
  2. ^ de Jean-Philippe Aumasson y Daniel J. Bernstein (18 de septiembre de 2012). "SipHash: una PRF rápida de entrada corta". Archivo de ePrints de criptología .
  3. ^ Lennon, Mike (28 de diciembre de 2011). "La vulnerabilidad de la tabla hash permite ataques DDoS a gran escala". SecurityWeek .
  4. ^ So, Won; Narayanan, Ashok; Oran, David; Stapp, Mark (2013). "Redes de datos con nombre en un enrutador". Actas de la conferencia ACM SIGCOMM 2013 sobre SIGCOMM. págs. 495–496. doi :10.1145/2486001.2491699. ISBN 9781450320566. S2CID  1457918 . Consultado el 28 de febrero de 2018 . El SipHash [1] propuesto recientemente ofrece un buen equilibrio, ya que proporciona resistencia a colisiones y un rendimiento comparable a los hashes no criptográficos.
  5. ^ Aumasson, Jean-Philippe; Bernstein, Daniel J .; Boßlet, Martin (8 de noviembre de 2012). DoS mediante inundación de hash: ataques y defensas (PDF) . Foro de seguridad de aplicaciones – Suiza occidental 2012. Archivado desde el original (PDF) el 13 de septiembre de 2013.
  6. ^ ab "SipHash: una PRF rápida de entrada corta". 2016-08-01. Archivado desde el original el 2017-02-02 . Consultado el 2017-01-21 . Propiedad intelectual: No tenemos conocimiento de ninguna patente o solicitud de patente relacionada con SipHash, y no tenemos previsto solicitar ninguna. El código de referencia de SipHash se publica bajo licencia CC0, una licencia similar a la del dominio público.
  7. ^ Crosby, Scott A.; Wallach, Dan S. (6 de agosto de 2003). Denegación de servicio mediante ataques de complejidad algorítmica. Simposio sobre seguridad de Usenix. Washington, DC
  8. ^ Aumasson, Jean-Philippe (veorq) (12 de noviembre de 2015). "Comentario sobre: ​​cambiar Siphash para usar una de las variantes más rápidas del algoritmo (Siphash13, Highwayhash) · Issue #29754 · rust-lang/rust". GitHub . Consultado el 28 de febrero de 2024 . Diseñador de SipHash aquí, no he cambiado mi opinión sobre SipHash-1-3 :-) [...] Hay un "distinguidor" en 4 rondas [...], o en términos más simples, un sesgo estadístico que aparece dado un patrón de diferencia específico en la entrada de la secuencia de 4 rondas. Pero no puedes inyectar ese patrón en SipHash-1-3 porque no controlas todo el estado. E incluso si pudieras inyectar ese patrón, el sesgo no sería explotable de todos modos.
  9. ^ Aumasson, Jean-Philippe; Bernstein, Daniel J. (1 de agosto de 2016). «SipHash: una PRF rápida de entrada corta, usuarios». Archivado desde el original el 2 de febrero de 2017. Consultado el 21 de enero de 2017 .
  10. ^ Vagg, Rod (28 de febrero de 2019). "build: enable v8's SipHash for hash seed creation" (Compilación: habilitar SipHash de v8 para la creación de semillas hash). Node.js. Consultado el 21 de octubre de 2021 a través de GitHub .
  11. ^ Guo, Yang (9 de enero de 2019). "Utilice halfsiphash de forma opcional para el hash de enteros". V8 . Consultado el 21 de octubre de 2021 .
  12. ^ "Biblioteca OCaml: Hashtbl" . Consultado el 17 de febrero de 2024 .
  13. ^ "Seguridad de Perl: ataques de complejidad algorítmica". Navegador Perldoc . 2016-05-16 . Consultado el 2021-10-21 .
  14. ^ Heimes, Christian (27 de septiembre de 2013). «PEP 456 – Algoritmo hash seguro e intercambiable» . Consultado el 21 de enero de 2017 .
  15. ^ "Pasando a SipHash-1-3 n.° 73596". GitHub .
  16. ^ McVey, Samantha (16 de julio de 2018). "Implementar SipHash, utilizar como nuestra función hash con valores hash de 64 bits". MoarVM . Consultado el 16 de julio de 2018 – a través de GitHub .
  17. ^ "Característica n.° 13017: Cambiar SipHash de SipHash24 a SipHash13 - Ruby master - Sistema de seguimiento de problemas de Ruby".
  18. ^ McArthur, Sean (30 de junio de 2016). «std: use siphash-1-3 para HashMap». Rust . Consultado el 21 de enero de 2017 a través de GitHub .
  19. ^ Poettering, Lennart (22 de diciembre de 2013). "shared: cambiamos nuestra implementación de tabla hash a SipHash". systemd . Consultado el 21 de enero de 2017 – a través de freedesktop.org .
  20. ^ "SRC/Sys/Crypto/Siphash.h en master · openbsd/SRC". GitHub .
  21. ^ "[base] Índice de /Head/Sys/Crypto/Siphash".
  22. ^ "Usar siphash para tablas hash · WireGuard/Wg-dynamic@360b9c8". GitHub .
  23. ^ "Relé de bloque compacto". GitHub . Consultado el 27 de septiembre de 2018 .
  24. ^ bslh_siphashalgorithm.h
  25. ^ "Bbloom/SipHash.go en 73e3f896a4f8bbed8589df6ff5c28ebfbd728e31 · ipfs/Bbloom". GitHub .

Enlaces externos