La respuesta está en el nombre: PBKDF es un acrónimo que significa "Función de derivación de clave basada en contraseña". Todo su trabajo es tomar una contraseña como entrada y generar una clave de cifrado como salida.
La razón principal por la que necesitamos funciones como esta es que los algoritmos de encriptación como AES toman una clave de tamaño fijo. Por definición, AES-128 requiere una clave de 128 bits (16 bytes). Pero la contraseña de un usuario es simplemente una serie de bytes: tal vez sean 50 bytes, tal vez sean solo 5 bytes, dependiendo de lo que ingresó el usuario. Por lo tanto, si desea usar la contraseña para cifrar, de alguna manera tiene que incrustar esa contraseña en los 16 bytes exactos requeridos por AES. Obviamente, ya estás haciendo algo así para introducir tu contraseña actual en AES, incluso si no la reconoces por ese nombre.
Un PBKDF está diseñado para tomar, sin embargo, los bytes que ingresa el usuario, mezclarlos todos usando un algoritmo (llamado hash) y luego producir una cadena de bits adecuada para usar como una clave. Si necesita 16 bytes para su clave AES, simplemente tome los primeros 16 bytes que salen de la función PBKDF.
Piense si no usó un PBKDF, pero en su lugar requirió que sus usuarios ingresen al menos una contraseña de 16 bytes. Sin un PBKDF, ¿qué sucede con todo después del byte 16? Se vuelve sin sentido. Si escribo una contraseña de security.stackexchange.com
, también podría escribir una contraseña de security.stackexPOSITION@ORG
o simplemente security.stackex
y cualquiera de ellas aún funcionaría. Pero como PBKDF mezcla todas esas letras juntas, todas contribuyen a la clave y se comprueba la contraseña completa.
La siguiente razón por la que necesitamos las funciones PBKDF es que las contraseñas tienen mucha predecibilidad, ya que los humanos de habla inglesa usualmente solo usan caracteres en los rangos de a-z, A-Z y 0-9. A pesar del hecho de que hay 8 bits en un byte, una contraseña de 10 caracteres no proporcionará 80 bits de incertidumbre en la clave; la mayoría proporcionará 47 bits (o menos) de incertidumbre, y eso significa que un atacante moderno puede adivinarlo fácilmente. Pero como PBKDF toma en cuenta todas las letras de la contraseña, hace que una contraseña de 20 caracteres sea más fuerte que una contraseña de 10 caracteres, y mejora la seguridad de sus usuarios.
Una rutina más fuerte como PBKDF2 va un paso más allá que un simple PBKDF para ayudar a proteger contra un ataque de adivinación de contraseña, al hacer que la operación requiera una gran cantidad de recursos informáticos. Un atacante que desee intentar adivinar cada palabra del diccionario necesitará solo unos pocos milisegundos para probar cada palabra como clave de descifrado. Un atacante que necesite ejecutar 10,000 hashes con PBKDF2 tardará horas o días en probar todo el diccionario.