¿Es necesario usar algo como bcrypt o scrypt? Los hashes son mucho más largos para almacenar en una base de datos. ¿Se puede salir con el uso de MD5 o SHA con sal y seguir siendo seguro?
MD5 y SHA-1 son enfáticamente malas opciones para almacenar contraseñas. El problema no es su resistencia a la colisión; es que están diseñados para ser extremadamente rápidos. Una GPU moderna puede intentar más de miles de millones de contraseñas por segundo cuando se fuerza a través de una lista de hashes. Esto puede destruir todas las contraseñas alfanuméricas de ocho caracteres posibles en un máximo de unos días; eso es solo con una GPU.
La ventaja de bcrypt y scrypt es que pueden consumir arbitrariamente muchos recursos; bcrypt tiene requisitos de CPU configurables, scrypt tiene requisitos de CPU y memoria configurables. Al aumentar estos factores de trabajo, puede aumentar dramáticamente la cantidad de esfuerzo que requiere un atacante para intentar incluso una sola contraseña en su base de datos.
En cuanto a la duración: es 2014. El almacenamiento es esencialmente infinitamente barato. Guardar 40 bytes por registro simplemente no es una excusa aceptable para seleccionar algoritmos de hashing de contraseña de bajo nivel de conocimiento. En cualquier proyecto en el que esté trabajando, seguramente hay tareas más valiosas para gastar en sus limitados recursos de desarrollo.
De hecho, no existe tal cosa como "MD5 salado" o "SHA-1 salado". MD5 y SHA-1 son funciones hash bien definidas, que toman como entrada una secuencia de bits de (casi) longitud arbitraria, y emiten una secuencia de bits de longitud fija (128 y 160). bits, respectivamente). No hay sal en ninguna parte en las definiciones de MD5 y SHA-1; ninguna contraseña tampoco, para el caso.
Lo que la gente llama "MD5 con sal" o "SHA-1 con sal" es en realidad una nueva construcción criptográfica, que reúne alguna convención de codificación (para transformar la contraseña en una secuencia de bits) y un valor de sal (otra secuencia de caracteres o bits) ) en una (o unas pocas) invocaciones de la función hash. Hay muchas formas posibles de hacerlo, y no hay un estándar. En el mejor de los casos, podemos tener una familia de diseños que se pueden agrupar bajo la terminología genérica "MD5 con algo de sal". Criptográficamente, estas construcciones no necesitan ser equivalentes entre sí; algunos pueden ser bastante pobres.
Incluso suponiendo que su "MD5 salado" específico no se estropea, sigue teniendo el problema principal de MD5 (o SHA-1), y esa es la velocidad . Velocidad significa que los atacantes pueden probar muchas contraseñas potenciales por segundo; los números están en los miles de millones por segundo (los puntos de referencia allí ). Si quieres "salir" con MD5 o SHA-1 con sal, debes luchar contra esa velocidad con más contraseña entropía . No la longitud de la contraseña, fíjate; la longitud solo se correlaciona ligeramente con la seguridad. Agregar más personajes no ayuda; agregar más caracteres que el atacante no conoce es lo que ayuda.
De manera realista, si debe salirse con MD5 o SHA-1 con sal, entonces debe usar al menos 60 bits de entropía en cada contraseña. Esto no es realista: los usuarios promedio no producirán ni recordarán tales contraseñas. En el mejor de los casos, puede considerarse feliz si sus usuarios logran 30 bits de entropía. En otras palabras, con MD5 o SHA-1 con sal, no alcanzará el nivel de seguridad requerido por un factor de mil millones o menos. Estas son malas probabilidades; para hacer una analogía, esto sería similar a intentar que los militares invadan los Estados Unidos cuando todo su ejército consiste en un solo soldado armado con un bate de béisbol. Falló Stallone . Incluso a Chuck Norris encontraría eso un desafío.
Ve a leer estas respuestas:
¡Y ve a comprar un nuevo disco! Mi primer disco duro real (en 1991) tenía un tamaño de 40 megabytes y habría sido adecuado para almacenar hashes bcrypt para más de medio millón de usuarios. ¿Su servidor tiene 23 años de hardware y tiene más de medio millón de usuarios? Si ese es el caso, entonces te saludo por tu valentía y te sugiero que vayas a dormir en algún asilo con asistencia médica. De lo contrario, el argumento de "los hashes son mucho más grandes" es que no hay una buena forma de decirlo, realmente estúpido.
Ok, es un método seguro para salirse con la utilización de MD5 salado o SHA-1. Basta con tener un servidor que sea tan poco interesante y desprovisto de datos no aburridos que los atacantes ni siquiera se molesten en atacarlo. La pereza sigue siendo la fuerza más poderosa en el Universo, después de todo.
No, no puede salirse con MD5 o SHA, y este tema realmente se ha discutido hasta la muerte.
Todos los algoritmos hash de propósito general como MD5 o SHA son extremadamente vulnerables a los ataques de fuerza bruta, porque están diseñados para la velocidad. Por ejemplo, una GPU antigua como la HD 6990 puede calcular aproximadamente 10 mil millones de hashes MD5 por segundo y 4 mil millones de hashes SHA-1 por segundo usando oclHashcat .
Es fácil ver que incluso las contraseñas decentes no sobrevivirán a tal ataque. Por ejemplo, buscar en todo el espacio de todas las contraseñas con 6 caracteres alfanuméricos solo toma 6 segundos si está usando MD5. E incluso 8 caracteres solo toman 6 horas. Agregar sales no cambia esto. Si bien las sales obligan al atacante a perseguir cada hash individualmente, esto no hace mucha diferencia en el rendimiento.
Cuando hash de contraseñas, no quieres velocidad. Por el contrario, el procedimiento debe ser muy costoso y lento. Es por eso que se necesitan algoritmos hash de contraseña especializados como bcrypt y scrypt.
Salting MD5 no es lo suficientemente bueno. MD5 no es resistente a las colisiones, lo que significa que un atacante puede crear una contraseña que coincida con cualquier valor de hash dado (sea o no la contraseña "correcta"). Al atacante no le importa cuál era el valor antes de que lo hicieras, incluyendo cualquier salado que hagas; solo necesitan el valor final para generar una contraseña válida.
Por otra parte, creo que la mayoría de las versiones de SHA (al menos SHA-2 y SHA-3) aún se consideran seguras, pero no sé cuál es el estado del arte para el almacenamiento de contraseñas. Dependiendo de la aplicación, es posible que desee ejecutarla varias veces.
EDITAR - Pensándolo bien, no estoy seguro de que se sepa que sea posible revertir MD5 para obtener un valor de sal particular si mantiene el valor asociado a la cuenta en el lado del servidor. Sin embargo, estoy bastante seguro de que aún no se recomienda el MD5 salado.