¿Está bien usar el hash SHA1 de la contraseña como un salt cuando se derivan la clave de cifrado y IV de la cadena de contraseña?

Estoy usandoRfc2898DeriveBytes para generar de forma segura la clave de cifrado y el vector de inicialización a partir de la contraseña de cadena suministrada por el usuario, para usar con el cifrado simétrico (por ejemplo, AesManaged).

Estoy tomando el hash SHA1 de contraseña como parámetro de sal paraRfc2898DeriveBytes. ¿Eso esta bien? Si no es así, ¿de dónde debo obtener la sal? Necesitaré la misma sal al descifrar, ¿verdad? Así que tengo que almacenarlo en algún lugar sin cifrar, sin asegurar. Si tengo que almacenarlo de forma segura, entonces simplemente se convierte en otra "contraseña", ¿no es así?

void SecureDeriveKeyAndIvFromPassword(string password, int iterations, 
    int keySize, int ivSize, out byte[] key, out byte[] iv)
{
    // Generate the salt from password:

    byte[] salt = (new SHA1Managed()).ComputeHash(Encoding.UTF8.GetBytes(password));

    // Derive key and IV bytes from password:

    Rfc2898DeriveBytes derivedBytes = new Rfc2898DeriveBytes(password, salt, iterations);

    key = derivedBytes.GetBytes(keySize);
    iv = derivedBytes.GetBytes(ivSize);
}

He visto el uso de la sal constante (codificada), y he visto personas que se quejan de ello. Pensé que obtener sal de una contraseña sería la mejor idea, pero no estoy seguro de que esta sea una solución óptima.

En breve, tengo un archivo que debe estar cifrado y el usuario debe ingresar una cadena de contraseña. ¿Cómo uso correctamenteRfc2898DeriveBytes para derivar clave de cifrado seguro y IV?

Gracias.

EDITAR:

Gracias por tus respuestas. Ahora entiendo que el propósito principal (¿quizás solo?) De sal es hacer que la generación de tablas de arco iris sea imposible; no se puede generar previamente el hash de "P @ $ w0rd" porque tendrá un hash diferente para cada posible valor de sal Entiendo esto perfectamente, PERO ... ¿Es esto realmente relevante para el cifrado simétrico? No estoy almacenando el hash en ningún lugar, ¿verdad? Entonces, incluso si el atacante tiene la tabla del arco iris para todas las combinaciones de contraseñas posibles, no puede hacer mucho, ¿verdad?

Entonces, mi pregunta ahora es: ¿Existe alguna ventaja de usar el sal aleatorio en cada operación de encriptación, en comparación con el uso de sal derivado de contraseña (o incluso de código fijo)?cuando se utiliza con algoritmos de cifrado simétrico (como AesManaged de .NET)?

Respuestas a la pregunta(5)

Su respuesta a la pregunta