Lo que se necesita primero y ante todo es un algoritmo de hash que sea lento. Los crackers descifran los hashes de contraseña ejecutando diccionarios de contraseña y otras combinaciones de caracteres a través del algoritmo de hash para ver si el hash calculado coincide con el Robado de una base de datos. Cuanto más lento sea el proceso, más difícil será "revertir" sus hashes si son robados.
A continuación, cada contraseña necesita una "sal" aleatoria diferente concatenada con ella antes de calcular el hash. El cracker que obtiene los hashes de la contraseña también podrá obtener las sales, pero la presencia de la sal frena los ataques de precomputación. Cada hash debe ser atacado por separado.
Finalmente, debe considerar el uso de una clave secreta no almacenada en una base de datos como un componente del hash. Esto a veces se llama "pimienta" y el resultado es un hash codificado. El atacante que obtiene hashes a través de algo como la inyección SQL no podrá descifrarlos porque se necesita esa clave secreta. (Por supuesto, el atacante que compromete el sistema operativo puede obtenerlo todo, pero eso es mucho más difícil que simplemente comprometer una base de datos).
La pregunta (y la respuesta) anotada por Xander tienen una cobertura completa: Cómo hacer hash de forma segura ¿contraseñas? Hay un buen ensayo aquí: enlace y algunos consejos más aquí: enlace