Argon2 es una función de derivación clave que fue seleccionada como ganadora del Concurso de hash de contraseñas en julio de 2015. [1] [2] Fue diseñado por Alex Biryukov , Daniel Dinu y Dmitry Khovratovich de la Universidad de Luxemburgo . [3] La implementación de referencia de Argon2 se publica bajo una licencia Creative Commons CC0 (es decir, dominio público ) o Apache License 2.0 , y proporciona tres versiones relacionadas:
- Argon2d maximiza la resistencia a los ataques de craqueo de GPU. Accede a la matriz de memoria en un orden dependiente de la contraseña, lo que reduce la posibilidad de ataques de compensación de tiempo-memoria (TMTO), pero introduce posibles ataques de canal lateral .
- Argon2i está optimizado para resistir ataques de canal lateral. Accede a la matriz de memoria en un orden independiente de la contraseña.
- Argon2id es una versión híbrida. Sigue el enfoque de Argon2i para la primera mitad del pase sobre la memoria y el enfoque de Argon2d para los pases posteriores. El borrador de Internet [4] recomienda usar Argon2id excepto cuando haya razones para preferir uno de los otros dos modos.
Los tres modos permiten la especificación mediante tres parámetros que controlan:
- Tiempo de ejecución
- memoria requerida
- grado de paralelismo
Criptoanálisis
Si bien no existe un criptoanálisis público aplicable a Argon2d, hay dos ataques publicados sobre la función Argon2i. El primer ataque es aplicable solo a la versión anterior de Argon2i, mientras que el segundo se ha extendido a la última versión (1.3) [5]
El primer ataque muestra que es posible calcular una función Argon2i de una sola pasada usando entre un cuarto y una quinta parte del espacio deseado sin penalización de tiempo, y calcular una Argon2i de múltiples pasadas usando solo N / e < N /2.71 espacio con sin penalización de tiempo. [6] Según los autores de Argon2, este vector de ataque se corrigió en la versión 1.3. [7]
El segundo ataque muestra que Argon2i puede ser calculado por un algoritmo que tiene complejidad O ( n 7/4 log ( n )) para todas las opciones de parámetros σ (costo de espacio), τ (costo de tiempo) y conteo de subprocesos tal que n = σ ∗ τ . [8] Los autores de Argon2 afirman que este ataque no es eficiente si Argon2i se usa con tres o más pasadas. [7] Sin embargo, Joël Alwen y Jeremiah Blocki mejoraron el ataque y demostraron que para que el ataque fallara, Argon2i 1.3 necesita más de 10 pases de memoria. [5]
Algoritmo
Función Argon2 Entradas: contraseña ( P ): Bytes (0..2 32 -1) Contraseña (o mensaje) a ser hash salt ( S ): Bytes (8..2 32 -1) Salt (se recomiendan 16 bytes para el hash de contraseña ) paralelismo ( p ): número (1..2 24 -1) grado de paralelismo (es decir, número de hilos) tagLength ( T ): número (4..2 32 -1) número deseado de bytes devuelto memorySizeKB ( m ): Número (8p..2 32 -1) Cantidad de memoria (en kibibytes ) para utilizar iteraciones ( t ): Número (1..2 32 -1) número de iteraciones para llevar a cabo la versión ( v ): Número (0x13) La corriente versión es 0x13 (19 decimal) clave ( K ): bytes (0..2 32 -1) clave opcional (Errata: PDF dice 0..32 bytes, RFC dice 0..2 32 bytes) associatedData ( X ): bytes (0..2 32 -1) Opcional arbitraria adicional de datos hashType ( y ): Número (0 = Argon2d, 1 = Argon2i, 2 = Argon2id) de salida: la etiqueta: bytes (tagLength) La resultante bytes generados, tagLength bytes de largo Genere el bloque inicial de 64 bytes H 0 . Todos los parámetros de entrada se concatenan y se introducen como una fuente de entropía adicional. Errata: RFC dice que H 0 es de 64 bits; PDF dice que H 0 tiene 64 bytes. Errata: RFC dice que el Hash es H ^, el PDF dice que es ℋ (pero no documenta lo que es ℋ). En realidad, es Blake2b. Los elementos de longitud variable se anteponen con su longitud como enteros little-endian de 32 bits. buffer ← paralelismo ∥ tagLength ∥ memorySizeKB ∥ iteraciones ∥ versión ∥ hashType ∥ Longitud (contraseña) ∥ Contraseña ∥ Longitud (sal) ∥ sal ∥ Longitud (tecla) ∥ tecla ∥ Longitud (datos asociados) ∥ Datos asociados H 0 ← Blake2b (búfer, 64) // el tamaño de hash predeterminado de Blake2b es de 64 bytes Calcule el número de bloques de 1 KB redondeando hacia abajo memorySizeKB al múltiplo más cercano de 4 * kibibytes de paralelismo blockCount ← Floor (memorySizeKB, 4 * paralelismo) Asignar matriz bidimensional de bloques de 1 KiB (filas de paralelismo x columnas columnCount ) columnCount ← blockCount / paralelismo; // En el RFC, columnCount se denomina q Calcule el primer y segundo bloque (es decir, columna cero y uno) de cada carril (es decir, fila) para i ← 0 al paralelismo-1 hacer para cada fila B i [0] ← Hash (H 0 ∥ 0 ∥ i, 1024) / / Generar un resumen de 1024 bytes B i [1] ← Hash (H 0 ∥ 1 ∥ i, 1024) // Generar un resumen de 1024 bytes Calcule las columnas restantes de cada carril para i ← 0 al paralelismo-1 do // para cada fila de j ← 2 a columnCount-1 do // para cada columna subsiguiente // los índices i 'y j' dependen si es Argon2i, Argon2d, o Argon2id (Ver sección 3.4) i ′, j ′ ← GetBlockIndexes (i, j) // la función GetBlockIndexes no está definida B i [j] = G (B i [j-1], B i ′ [j ′] ) // la función hash G no está definida Otros pases cuando iteraciones> 1 para nIteration ← 2 a iteraciones hacen para i ← 0 a paralelismo-1 hacen para cada fila para j ← 0 a columnCount-1 hacer // para cada columna posterior // i 'y j' índices dependen si es Argon2i, Argon2d o Argon2id (consulte la sección 3.4) i ′, j ′ ← GetBlockIndexes (i, j) si j == 0 entonces B i [0] = B i [0] xor G (B i [columnCount-1], B i ′ [j ′]) si no B i [j] = B i [j] xor G (B yo [j-1], B yo ′ [j ′]) Calcule el bloque final C como el XOR de la última columna de cada fila C ← B 0 [columnCount-1] para i ← 1 al paralelismo-1 do C ← C xor B i [columnCount-1] Calcular el retorno de la etiqueta de salida Hash (C, tagLength)
Función hash de longitud variable
Argon2 utiliza una función hash capaz de producir resúmenes de hasta 2 32 bytes de longitud. Esta función hash se basa internamente en Blake2 .
Función Hash (mensaje, digestSize) Entradas: mensaje: Bytes (0..2 32 -1) Mensaje que se hash entero (1..2: digestSize 32 ) número deseado de bytes a ser devueltos de salida: digerir: Bytes (digestSize) Los bytes generados resultantes, digerirSize bytes de longitud Hash es una función hash de longitud variable, construida con Blake2b, capaz de generar resúmenes de hasta 2 32 bytes. Si el digestSize solicitado es de 64 bytes o menos, entonces usamos Blake2b directamente si (digestSize <= 64) luego devolvemos Blake2b (digestSize ∥ message, digestSize) // concatenamos el little endian digestSize de 32 bits con los bytes del mensaje Para los hash deseados de más de 64 bytes (por ejemplo, 1024 bytes para bloques Argon2), usamos Blake2b para generar el doble de la cantidad de bloques de 64 bytes necesarios, y luego solo use 32 bytes de cada bloque Calcule la cantidad de bloques completos (sabiendo que solo usaremos 32 bytes de cada uno) r ← Ceil (digestSize / 32) -1; Genera r bloques enteros. El bloque inicial se genera a partir del mensaje V 1 ← Blake2b (mensaje digestSize ∥, 64); Los bloques subsiguientes se generan a partir de bloques anteriores para i ← 2 a r do V i ← Blake2b (V i-1 , 64) Genera el bloque final (posiblemente parcial) ParticularBytesNeeded ← digestSize - 32 * r; V r + 1 ← Blake2b (V r , bytes parciales necesarios) Concatenar los primeros 32 bytes de cada bloque V i (excepto el último bloque posiblemente parcial, que tomamos en su totalidad) Sea A i los 32 bytes inferiores del bloque V i devuelva A 1 ∥ A 2 ∥ ... ∥ A r ∥ V r + 1
Referencias
- ^ "Concurso de hash de contraseñas"
- ↑ Jos Wetzels (8 de febrero de 2016). "Open Sesame: la competencia de hash de contraseña y Argon2". arXiv : 1602.03097 [ cs.CR ]. Parámetro desconocido
|url=
ignorado ( ayuda )Mantenimiento de CS1: utiliza el parámetro de autores ( enlace ) - ^ Argon2: la función de memoria dura para el hash de contraseñas y otras aplicaciones , Alex Biryukov, et al, 1 de octubre de 2015
- ^ https://datatracker.ietf.org/doc/draft-irtf-cfrg-argon2/ La función de prueba de trabajo y hash de contraseña de Argon2 con memoria dura, draft-irtf-cfrg-argon2-03, consultado el 16 de agosto de 2017
- ^ a b Joël Alwen, Jeremiah Blocki (5 de agosto de 2016). "Hacia ataques prácticos sobre Argon2i y el hash de globos" (PDF) . Cite journal requiere
|journal=
( ayuda )Mantenimiento de CS1: utiliza el parámetro de autores ( enlace ) - ^ Henry Corrigan-Gibbs, Dan Boneh, Stuart Schechter (14 de enero de 2016). "Hash de globo: funciones de hash probables en el espacio con patrones de acceso independientes de los datos" (PDF) . Cite journal requiere
|journal=
( ayuda )Mantenimiento de CS1: utiliza el parámetro de autores ( enlace ) - ^ a b "[Cfrg] Argon2 v.1.3" . www.ietf.org . Consultado el 30 de octubre de 2016 .
- ^ Joel Alwen, Jeremiah Blocki (19 de febrero de 2016). "Computación eficiente de las funciones de memoria dura independientes de los datos" (PDF) . Cite journal requiere
|journal=
( ayuda )Mantenimiento de CS1: utiliza el parámetro de autores ( enlace )