La familia SHA-2 en sí no es necesariamente mala. Por diseño, en realidad no hay fallas de seguridad que hagan que bcrypt o scrypt sean preferibles. Sin embargo, el problema que muchos expertos en seguridad tienen con SHA es que es demasiado rápido y no requiere mucha memoria. En comparación, una función de hashing como scrypt es mucho más lenta y costosa, por así decirlo.
Scrypt requiere una cantidad decente de memoria para calcular. Además de toda esta memoria, y en gran parte como resultado de necesitar tanta memoria, scrypt requiere mucho tiempo de cálculo en comparación con SHA. Esta respuesta del sitio BitCoin Stack Exchange resume las ventajas de scrypt bastante bien: ¿Qué características de scrypt () hacen que Tenebrix sea resistente a la GPU? En esencia, scrypt está diseñado para ser lento y requiere mucha memoria. A las GPU no les gusta eso. Por lo general, las GPU no tienen la capacidad de memoria para almacenar toda la memoria necesaria para el cálculo de scrypt sin tener que recurrir a métodos de bloqueo de ejecución ( donde la GPU bloquea todos los subprocesos porque solo puede recuperar valores de la memoria compartida, uno a uno ), y por lo tanto, las GPU no pueden proporcionar un gran beneficio sobre las CPU en términos de tiempo de procesamiento. Bcrypt es similar.
Bcrypt se ha probado y es verdadero para el hashing de contraseñas. Ha existido durante 17 años, y todavía hace el trabajo. Sin embargo, un día, la tecnología de GPU avanzará hasta el punto en que sea capaz de calcular un cifrado más rápido y más eficiente que una CPU. La tecnología siempre está evolucionando y desarrollándose, por lo que eventualmente sucederá. Cuando llegue ese día, bcrypt ya no será una excelente elección para el hash de contraseñas, y los criptógrafos y los expertos en seguridad necesitarán reemplazar bcrypt con un algoritmo similar que requiere más memoria y más memoria que el bcrypt existente. Tal vez eso sea scrypt, pero quién puede decir. Entonces, ¿por qué SHA está mal visto?
SHA generalmente no se recomienda debido a fallas de seguridad, sino a la velocidad y su capacidad para implementarse en una GPU. Alguien con máquinas / capacidad de computación ilimitadas podría descifrar cualquier tipo de algoritmo de hash, ya sea SHA, bcrypt o scrypt, pero eso es teórico. En la práctica, un atacante no tendrá un número ilimitado de máquinas para tratar de descifrar hashes, y, como resultado, cuanto más pueda ralentizar a ese atacante, más difícil será para él descifrar una contraseña. Hay un límite de presupuesto para todo, y el descifrado de contraseñas no es una excepción. El atacante solo puede descifrar contraseñas tan rápido como lo permita su presupuesto. ( La mejor tecnología que pueden comprar dentro de su presupuesto, el costo de ejecutar esa tecnología (por ejemplo, costos de electricidad), etc. ) Por supuesto, puede implementar varias rondas de SHA para ralentizar severamente a un atacante. , pero ¿por qué no usar simplemente bcrypt en ese punto? Entre otras cosas, a medida que la tecnología de GPU avance en el futuro cercano, deberá agregar más y más rondas / iteraciones a sus cálculos de SHA para reducir la velocidad hasta el punto en que sea más lenta que bcrypt. Sin embargo, a medida que avanza la tecnología de GPU, bcrypt seguirá sin cambios, hasta el punto en que la tecnología de GPU permite que bcrypt se calcule de manera eficiente. Por lo tanto, bcrypt es la opción preferible siempre que sea posible, no porque SHA sea insegura, sino porque SHA es demasiado computacionalmente eficiente.