En primer lugar, ¿por qué está implementando un código criptográfico de bajo nivel para una página web? Usted pensaría que este es un problema resuelto: utiliza un marco que utiliza bibliotecas.
En segundo lugar, el hash protege las contraseñas en caso de que se filtren. Su sitio no proporciona acceso a la base de datos de contraseñas, por lo que, idealmente, esta situación no debería surgir. Las sales ayudan a defender la base de datos de contraseñas en su totalidad en ese evento.
Si el atacante está enfocado en una sola contraseña de esa base de datos, entonces no hay mucha diferencia. Solo dificulta el trabajo en el sentido de que el atacante no puede simplemente recuperar la contraseña de una tabla de arco iris buscando el hash. La fuerza bruta de una contraseña con un salt solo se ralentiza ligeramente porque se procesan unos pocos bytes más, lo que cuesta unos pocos ciclos de máquina más en las rondas de hashing.
Érase una vez, los sistemas Unix que proporcionan acceso público (como los sistemas de campus para estudiantes) tenían sus contraseñas descifradas a la izquierda y a la derecha. Hubo varias razones por las que esto fue fácil, pero el problema principal fue simple: la información confidencial de hash de la contraseña se mantuvo en el mismo archivo que los otros campos de información sobre un usuario, y ese archivo, /etc/passwd
fue legible en todo el mundo. La solución es colocar la información confidencial en un archivo separado, /etc/shadow
. Presto: eso termina con el descifrado de contraseñas por parte de los chavales de script que tienen cuentas legítimas y sin privilegios en el sistema.
Del mismo modo, nadie será brutal forzando tus contraseñas a menos que dejes que se filtren.
Si se filtran y alguien está detrás de la contraseña de un usuario en particular, hay poco que se pueda hacer para detenerlos.
Los usuarios que usan las mismas contraseñas en diferentes sistemas y no las cambian durante años y
Los años siempre van a ser vulnerables. Puedes saltearlo, salpimentarlo y agregar ketchup; no hará una diferencia.
Las sales disuaden a alguien que quiere descifrar la base de datos de contraseñas como un todo y reúnen tantas contraseñas diferentes como sea posible. Las sales significan que cada contraseña debe ser forzada de manera bruta individualmente en lugar de solo recuperarse de tablas precalculadas. Si una sal tiene N bits, entonces, al menos idealmente, la base de datos de la tabla del arco iris del atacante debe ser 2 ^ N veces más grande. Una sal de 32 bits significa que necesita una base de datos de tabla arco iris cuatro mil millones de veces más grande para simplemente buscar contraseñas.
Si su sitio solo tiene 20 usuarios, por supuesto, solo hay hasta 20 sales diferentes. Entonces, lo que hará un atacante es tomar el diccionario de contraseñas y hacer hash en cada entrada de 20 maneras diferentes con esas sales.
Por lo tanto, las sales no solo protegen su base de datos contra la búsqueda en la tabla del arco iris, sino que también la protegen del craqueo de fuerza bruta en un factor de N, donde N es el número de usuarios. Para las contraseñas de fuerza bruta N, el atacante tiene que hacer N veces el trabajo como fuerza bruta. (Suponiendo que la sal sea lo suficientemente amplia: al menos tan grande como el logaritmo en base 2 de N. Si una sal es solo de 12 bits, digamos, solo puede haber 4096 sales diferentes, sin importar cuántos usuarios haya).
Sin sales, esto no es cierto. Brute forzar cualquier cantidad de contraseñas al mismo tiempo es tan fácil como brute forzar una, por lo que cuantos más usuarios haya, mayor será la recompensa por esfuerzo.