Para la función hash, desea utilizar una función para la cual el tipo de plataforma más eficiente (la que producirá más cálculos de hash por segundo y por dólar) sea la máquina que pretende utilizar (es decir, una PC) . Eso es porque estás en una carrera de armas con el atacante, y el atacante puede comprar otro tipo de hardware para obtener una ventaja sobre ti (como una GPU). La GPU es muy buena en aritmética de 32 bits, pero no en aritmética de 64 bits, mientras que una PC (en modo de 64 bits) será bastante rápida en esta última.
Por lo tanto, use una función hash que se ejecuta en operaciones aritméticas de 64 bits. Esto apunta a SHA-512 .
PBKDF2 es una función de derivación clave : produce una salida de tamaño configurable. Para el hashing de contraseñas, desea que el tamaño sea lo suficientemente grande como para disuadir ataques genéricos de preimagen (es decir, probar contraseñas aleatorias hasta que se encuentre una coincidencia), por lo que esto necesitaría, digamos, al menos 80 bits de salida. Si solo por hacer que la seguridad sea más convincente para los incautos y también para la estética, elija la siguiente potencia de 2: una salida de 128 bits . No es útil ir más allá de eso.
La sal debe ser única , lo más única posible. Una forma fácil de lograr valores únicos de sal es generar sales con un PRNG criptográficamente fuerte : la probabilidad de reutilizar un valor de sal será suficientemente bajo para ser descuidado si estas sales aleatorias son lo suficientemente grandes, y "lo suficientemente grande" significa "128 bits". Por lo tanto, use sales de 128 bits aleatorias .
Personalmente, yo prefiero bcrypt sobre PBKDF2 para el hashing de contraseñas.