No trabalho, temos duas teorias concorrentes para os sais. Os produtos em que trabalho usam algo como um nome de usuário ou número de telefone para adicionar o hash. Essencialmente, algo diferente para cada usuário, mas que está prontamente disponível para nós. O outro produto gera aleatoriamente um salt para cada usuário e muda cada vez que o usuário altera a senha. O salt é então criptografado no banco de dados.
Minha pergunta é se a segunda abordagem é realmente necessária? Posso entender de uma perspectiva puramente teórica que é mais seguro do que a primeira abordagem, mas e do ponto de vista prático. Agora, para autenticar um usuário, o salt deve ser descriptografado e aplicado às informações de login.
Depois de pensar sobre isso, simplesmente não vejo um ganho real de segurança com essa abordagem. Alterar o salt de conta para conta ainda torna extremamente difícil para alguém tentar forçar o algoritmo de hashing, mesmo se o invasor estiver ciente de como determinar rapidamente o que era para cada conta. Isso pressupõe que as senhas são suficientemente fortes. (Obviamente, encontrar o hash correto para um conjunto de senhas com dois dígitos é significativamente mais fácil do que encontrar o hash correto de senhas com 8 dígitos). Estou incorreto em minha lógica ou há algo que estou perdendo?
EDIT: Ok, então aqui está a razão pela qual eu acho que é realmente discutível criptografar o sal. (deixe-me saber se estou no caminho certo).
Para a explicação a seguir, assumiremos que as senhas têm sempre 8 caracteres e o salt é 5 e todas as senhas são compostas de letras minúsculas (isso apenas torna a matemática mais fácil).
Ter um sal diferente para cada entrada significa que não posso usar a mesma tabela de arco-íris (na verdade, tecnicamente, poderia se tivesse um de tamanho suficiente, mas vamos ignorar isso por enquanto). Pelo que entendi, essa é a verdadeira chave do sal, porque para quebrar todas as contas tenho que reinventar a roda, por assim dizer, para cada um. Agora, se eu souber como aplicar o salt correto a uma senha para gerar o hash, faria isso porque um salt realmente apenas estende o comprimento / complexidade da frase com hash. Portanto, estaria cortando o número de combinações possíveis que precisaria gerar para "saber" que tenho a senha + salt de 13 ^ 26 para 8 ^ 26 porque sei o que é o sal. Isso torna tudo mais fácil, mas ainda muito difícil.
Então, para criptografar o sal. Se eu souber que o salt está criptografado, não tentaria descriptografá-lo (presumindo que sei que ele tem um nível suficiente de criptografia) primeiro. Eu iria ignorar isso. Em vez de tentar descobrir como descriptografá-lo, voltando ao exemplo anterior, eu apenas geraria uma tabela de arco-íris maior contendo todas as chaves de 13 ^ 26. Não saber o sal definitivamente iria me atrasar, mas não acho que acrescentaria a tarefa monumental de tentar quebrar a criptografia do sal primeiro. É por isso que acho que não vale a pena. Pensamentos?
Aqui está um link que descreve por quanto tempo as senhas resistem a um ataque de força bruta: http://www.lockdown.co.uk/?pg=combi