¿Qué es "cracking"? Es encontrar un valor de contraseña que su sistema acepte, es decir, uno que coincida con lo que su sistema almacene como valor hash en su base de datos. Si el atacante encuentra otra contraseña otra , distinta de la contraseña "verdadera", pero que coincide con el hash, el atacante gana.
Para un valor hash dado, ya hay muchas contraseñas coincidentes (porque hay "solo" 2256 posibles valores hash, y muchas más contraseñas posibles si acepta) contraseñas "largas", digamos 50 caracteres). Al truncar el valor de hash, solo aumentará el número de contraseñas que, cuando se hash y truncado, coincidirán con lo que almacenó; es decir, solo hace las cosas más fáciles para el atacante.
Ahora las cosas no son necesariamente tan terribles. SHA-256 ofrece 256 bits de salida porque intenta ofrecer resistencia a las colisiones de al menos 2128 , y necesita 256 bits de salida para conseguir tanta resistencia. Sin embargo, las colisiones no son un problema para el almacenamiento de contraseña hash; lo que se necesita es resistencia a las imágenes previas . Este requiere solo n bits de salida para la resistencia de 2n . En otras palabras, si mantiene solo 128 bits (es decir, 32 caracteres hexadecimales), entonces todavía está "bien", o al menos no es sustancialmente peor que lo que sería con los 64 caracteres completos.
Precaución: un hash simple no es bueno . Aunque no lo debilites más (al menos no de una manera prácticamente significativa) al truncarlo, ya tienes dos problemas:
- No tiene sal, lo que le permite al atacante aplicar un paralelismo en el tiempo o en el espacio. Es decir, atacar muchas contraseñas simultáneamente y / o usar tablas precomputadas (tablas arcoiris).
- Un solo hash es demasiado rápido, lo que facilita al atacante probar millones, posiblemente miles de millones de contraseñas potenciales por segundo.
Por lo tanto, necesita un mejor proceso de hashing de contraseñas, uno que se pueda configurar para la lentitud y que use un salt (un nuevo salt aleatorio para cada contraseña). La recomendación habitual es bcrypt . Entonces, y solo entonces, podría visualizar un truncamiento (pero debe mantener al menos 128 bits, y no se recomiendan las alteraciones caseras de los algoritmos criptográficos en general).
Editar: para aclarar las cosas: un atacante con capacidad de computación ilimitada puede tratar de enumerar todas las contraseñas posibles y mantener las que coinciden con los valores hash almacenados. Estos son candidatos para ser "verdaderos" contraseña. Al truncar el hash, aumenta el número de candidatos, por lo que, bajo cierta luz, el atacante está más lejos de adivinar la "contraseña verdadera". Sin embargo, el atacante no está detrás de la "contraseña verdadera", sino después de una contraseña que otorga acceso. Cualquier contraseña que coincida con el valor almacenado otorgará acceso, ya que el servidor otorga acceso en base a "la contraseña ingresada coincide con el valor hash almacenado". Así que cualquier candidato es lo suficientemente bueno para el atacante.