En criptografía , PBKDF1 y PBKDF2 ( Función de derivación de clave basada en contraseña 1 y 2 ) son funciones de derivación de clave con un costo computacional variable, utilizadas para reducir la vulnerabilidad a ataques de fuerza bruta . [1]
PBKDF2 es parte de la serie de estándares de criptografía de clave pública (PKCS) de RSA Laboratories , específicamente PKCS #5 v2.0, también publicado como RFC 2898 de Internet Engineering Task Force . Reemplaza a PBKDF1, que solo podía producir claves derivadas de hasta 160 bits de longitud. [2] RFC 8018 (PKCS #5 v2.1), publicado en 2017, recomienda PBKDF2 para el hash de contraseñas. [3]
PBKDF2 aplica una función pseudoaleatoria , como un código de autenticación de mensajes basado en hash (HMAC), a la contraseña o frase de contraseña de entrada junto con un valor de sal y repite el proceso muchas veces para producir una clave derivada , que luego se puede usar como clave criptográfica en operaciones posteriores. El trabajo computacional adicional hace que el descifrado de contraseñas sea mucho más difícil, y se conoce como estiramiento de clave .
Cuando se escribió el estándar en el año 2000, el número mínimo recomendado de iteraciones era 1000, pero se pretende que el parámetro aumente con el tiempo a medida que aumente la velocidad de la CPU. Un estándar Kerberos en 2005 recomendó 4096 iteraciones; [1] Apple supuestamente utilizó 2000 para iOS 3 y 10 000 para iOS 4 ; [4] mientras que LastPass en 2011 utilizó 5000 iteraciones para clientes JavaScript y 100 000 iteraciones para hash del lado del servidor. [5] En 2023, OWASP recomendó utilizar 600 000 iteraciones para PBKDF2-HMAC-SHA256 y 210 000 para PBKDF2-HMAC-SHA512. [6]
La adición de una sal a la contraseña reduce la capacidad de usar hashes precalculados ( tablas arcoíris ) para ataques, y significa que se deben probar varias contraseñas individualmente, no todas a la vez. El estándar de criptografía de clave pública recomienda una longitud de sal de al menos 64 bits. [7] El Instituto Nacional de Estándares y Tecnología de EE. UU. recomienda una longitud de sal de al menos 128 bits. [8]
La función de derivación de clave PBKDF2 tiene cinco parámetros de entrada: [9]
dónde:
Cada bloque de bits hLen T i de la clave derivada DK se calcula de la siguiente manera (con + marcando la concatenación de cadenas):
La función F es el xor ( ^ ) de c iteraciones de PRF encadenadas. La primera iteración de PRF utiliza Password como clave de PRF y Salt concatenado con i codificado como un entero de 32 bits big-endian como entrada. (Tenga en cuenta que i es un índice basado en 1). Las iteraciones posteriores de PRF utilizan Password como clave de PRF y la salida del cálculo de PRF anterior como entrada:
dónde:
Por ejemplo, WPA2 utiliza:
PBKDF1 tenía un proceso más simple: la U inicial (llamada T en esta versión) se crea mediante PRF( Password + Salt ) , y las siguientes son simplemente PRF( U previous ) . La clave se extrae como los primeros bits dkLen del hash final, por lo que hay un límite de tamaño. [9]
PBKDF2 tiene una propiedad interesante cuando se utiliza HMAC como su función pseudoaleatoria. Es posible construir de manera trivial cualquier cantidad de pares de contraseñas diferentes con colisiones dentro de cada par. [10] Si una contraseña suministrada es más larga que el tamaño de bloque de la función hash HMAC subyacente, la contraseña se prehashiza primero en un resumen, y ese resumen se utiliza en su lugar como contraseña. Por ejemplo, la siguiente contraseña es demasiado larga:
plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
Por lo tanto, al utilizar HMAC-SHA1, se realiza un hash previo mediante SHA-1 en:
65426b585154667542717027635463617226672a
Que se puede representar en ASCII como:
eBkXQTfuBqp'cTcar&g*
Esto significa que, independientemente de la sal o las iteraciones, PBKDF2-HMAC-SHA1 generará los mismos bytes de clave para las contraseñas:
Por ejemplo, utilizando:
Las siguientes dos llamadas de función:
PBKDF2 - HMAC - SHA1 ( "plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd" , ... ) PBKDF2 - HMAC - SHA1 ( "eBkXQTfuBqp'cTcar&g*" , ... )
generará los mismos bytes de clave derivada ( 17EB4014C8C461C300E9B61518B9A18B
). Estas colisiones de clave derivada no representan una vulnerabilidad de seguridad, ya que uno todavía debe conocer la contraseña original para generar el hash de la contraseña. [11]
Una debilidad de PBKDF2 es que, si bien su número de iteraciones se puede ajustar para que tome una cantidad arbitrariamente grande de tiempo de cálculo, se puede implementar con un circuito pequeño y muy poca RAM, lo que hace que los ataques de fuerza bruta que utilizan circuitos integrados específicos de la aplicación o unidades de procesamiento de gráficos sean relativamente baratos. [12] La función de hash de contraseña bcrypt requiere una mayor cantidad de RAM (pero aún no se puede ajustar por separado, es decir, se fija para una cantidad determinada de tiempo de CPU) y es significativamente más fuerte contra tales ataques, [13] mientras que la función de derivación de clave scrypt más moderna puede usar cantidades arbitrarias de memoria y, por lo tanto, es más resistente a los ataques ASIC y GPU. [12]
En 2013, se llevó a cabo la competencia de hash de contraseñas (PHC) para desarrollar un enfoque más resistente. El 20 de julio de 2015, Argon2 fue seleccionado como el ganador final de la competencia, y se le dio un reconocimiento especial a otros cuatro esquemas de hash de contraseñas: Catena, Lyra2 , yescrypt y Makwa. [14] Otra alternativa es el hash Balloon , que se recomienda en las pautas de contraseñas del NIST . [15]
Para limitar un ataque de fuerza bruta , es posible hacer que cada intento de contraseña requiera una interacción en línea, sin dañar la confidencialidad de la contraseña. Esto se puede hacer utilizando una función pseudoaleatoria inconsciente para realizar el endurecimiento de la contraseña . [16] Esto se puede hacer como alternativa a, o como un paso adicional en, un PBKDF.