Há problema em usar SHA1 hash de senha como um salt ao derivar chave de criptografia e IV da string de senha?

estou a usarRfc2898DeriveBytes para gerar com segurança chave de criptografia e vetor de inicialização da senha de cadeia fornecida pelo usuário, para usar com criptografia simétrica (por exemplo, AesManaged).

Eu estou tomando o hash SHA1 de senha como um parâmetro de salt paraRfc2898DeriveBytes. Tudo bem? Se não, então de onde devo pegar o sal? Vou precisar do mesmo sal quando descriptografar, certo? Então eu tenho que armazená-lo em algum lugar sem criptografia - não segura. Se eu tiver que armazená-lo com segurança, ele se tornará outra "senha", não é?

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);
}

Eu vi usando o sal constante (hard-coded), e eu vi pessoas reclamando sobre isso. Eu pensei que derivar sal da senha seria a melhor idéia, mas não tenho certeza se esta é uma solução ótima.

Logo, eu tenho um arquivo que precisa ser criptografado e a entrada da string de senha pelo usuário. Como faço para usar corretamenteRfc2898DeriveBytes derivar chave de criptografia segura e IV?

Obrigado.

EDITAR:

Obrigado por suas respostas. Eu entendo agora que o principal (talvez apenas?) Propósito do sal é tornar a geração de tabelas de arco-íris impossível - você não pode pré-gerar o hash de "P @ $ w0rd" porque ele terá um hash diferente para cada possível valor salino. Eu entendo isso perfeitamente, MAS ... Isso é realmente relevante para a criptografia simétrica? Eu não estou armazenando o hash em qualquer lugar certo? Então, mesmo que o atacante tenha a tabela do arco-íris para todas as possíveis combinações de senha, ele não pode fazer muito, certo?

Então, a minha pergunta agora é: há alguma vantagem de usar o sal aleatório em cada operação de criptografia, em comparação com o uso de sal derivado por senha (ou mesmo codificado),quando usado com algoritmos de criptografia simétrica (como AesManaged of .NET)?

questionAnswers(5)

yourAnswerToTheQuestion