Los algoritmos de hash de contraseñas, como PBKDF2, bcrypt y scrypt, están diseñados para usar con contraseñas y son deliberadamente lentos. Los algoritmos criptográficos de hash son rápidos. Rápido es bueno en la mayoría de las situaciones, pero no aquí. Disminuir la velocidad del algoritmo (generalmente por iteración) hace que el trabajo del atacante sea mucho más difícil. Los hashes de contraseña también agregan un valor de sal a cada hash para que sea único, de modo que un atacante no pueda atacar varios hashes al mismo tiempo.
Los atacantes intentarán recuperar las contraseñas realizando ataques de diccionario y de fuerza bruta en los que adivinen contraseñas y las comparen con la contraseña almacenada para determinar si coinciden. Con funciones hash criptográficas regulares (por ejemplo, MD5, SHA256), un atacante puede adivinar miles de millones de contraseñas por segundo. Con PBKDF2, bcrypt o scrypt, el atacante solo puede hacer unos pocos miles de intentos por segundo (o menos, según la configuración).
Esto significa que cada contraseña es mucho más segura si se utilizan PBKDF2, bcrypt o scrypt en lugar de una función hash normal.
Además, PBKDF2, bcrypt y scrypt utilizan valores de "sal" aleatorios de gran tamaño para asegurarse de que la contraseña de cada usuario esté con un hash único. Atacar 100 hashes de contraseña llevará 100 veces más que atacar un hash. Atacar a un millón tomará un millón de veces más, etc. Con SHA256, el atacante puede intentar romper miles o millones de hashes al mismo tiempo con muy poca ralentización.
Siempre debe usar un hash de contraseña o "fórmula de derivación de clave" para las contraseñas en lugar de un hash criptográfico ordinario. Es muy difícil seleccionar contraseñas que sean lo suficientemente fuertes como para soportar un esfuerzo de descifrado dedicado si se las utiliza con algo como SHA o MD5. Con PBKDF2, bcrypt o scrypt, las contraseñas pueden tener tan solo 7 u 8 caracteres, pero con MD5 o SHA, deben tener al menos 13-14 caracteres.