Lea ¿Cómo hacer hash de las contraseñas de forma segura? , no debe rodar las suyas. @ThomasPornin tiene una gran respuesta a esa pregunta , y la sección sobre Generación de sal incluye (entre muchos más buenos consejos ) la siguiente sabiduría:
El punto principal y único de la sal es ser lo más único posible. Siempre que se reutiliza un valor de sal en cualquier lugar, esto tiene el potencial de ayudar al atacante.
Por ejemplo, si usa el nombre de usuario como sal, entonces un atacante (o varios atacantes en conflicto) podría encontrar valioso construir tablas de arco iris que ataquen la función de hashing de contraseña cuando la sal es "admin" (o "root" o "joe") porque habrá varios, posiblemente muchos sitios en todo el mundo que tendrán un usuario llamado "admin". De manera similar, cuando un usuario cambia su contraseña, generalmente mantiene su nombre, lo que lleva a la reutilización de sal. snip
La forma barata de obtener la singularidad es usar la aleatoriedad. Si genera su sal como una secuencia de bytes aleatorios del PRNG criptográficamente seguro que ofrece su sistema operativo (/ dev / urandom, CryptGenRandom () ...), obtendrá valores de sal que serán "únicos con una probabilidad suficientemente alta. ". 16 bytes son suficientes para que nunca veas una colisión de sal en tu vida, lo cual es excesivo pero lo suficientemente simple. snip
¡Esencialmente, no puede usar la contraseña para generar un salt para la contraseña, ya que la ÚNICA entrada es la contraseña!
- Por lo tanto, un atacante solo necesita poner "123456" en su generador de hash una vez, y luego encontrarán a todos los miles de usuarios que usaron eso como su contraseña. Si tuvieras sales aleatorias, tendrían que intentar miles de veces (una vez por combinación de sal + contraseña) para obtener esas miles de contraseñas débiles.
Debería usar un generador de números aleatorios para generar sales únicas por usuario (y almacenarlas en texto sin formato en la base de datos, junto con el hash de la contraseña y el número de iteraciones o factores de trabajo utilizados [para que pueda aumentarlo fácilmente más adelante] ), y el consejo general aquí es para una sal aleatoria de aproximadamente 16 bytes. 8 bytes es probablemente un mínimo práctico para la longitud de la sal.