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
fonte
Respostas:
A resposta aqui é perguntar a si mesmo do que você realmente está tentando se proteger. Se alguém tiver acesso ao seu banco de dados, então essa pessoa terá acesso aos sais criptografados e provavelmente terá acesso ao seu código também. Com tudo isso eles poderiam descriptografar os sais criptografados? Nesse caso, a criptografia é praticamente inútil de qualquer maneira. O salt realmente está lá para fazer isso, de forma que não seja possível formar uma tabela de arco-íris para quebrar seu banco de dados de senhas inteiro de uma vez se ele for invadido. Desse ponto de vista, desde que cada sal seja único, não há diferença, um ataque de força bruta seria necessário com seus sais ou os sais criptografados para cada senha individualmente.
fonte
Esconder um sal é desnecessário.
Um sal diferente deve ser usado para cada hash. Na prática, isso é fácil de conseguir obtendo 8 ou mais bytes do gerador de números aleatórios de qualidade criptográfica.
De uma resposta anterior minha :
Depois de pensar um pouco mais sobre isso, percebi que é perigoso se enganar pensando que o sal pode estar escondido. É muito melhor presumir que o sal não pode ser escondido e projetar o sistema para ser seguro apesar disso. Eu forneço uma explicação mais detalhada em outra resposta.
No entanto, recomendações recentes do NIST encorajam o uso de um "sal" secreto adicional (já vi outras pessoas chamarem esse segredo adicional de "pimenta"). Uma iteração adicional da derivação de chave pode ser realizada usando este segredo como um sal. Em vez de aumentar a força contra um ataque de pesquisa pré-computado, essa rodada protege contra adivinhação de senha, bem como o grande número de iterações em uma boa função de derivação de chave. Este segredo não tem nenhum propósito se armazenado com a senha em hash; ele deve ser gerenciado como um segredo e isso pode ser difícil em um grande banco de dados de usuários.
fonte
Meu entendimento de "sal" é que ele torna o cracking mais difícil, mas não tenta ocultar os dados extras. Se você está tentando obter mais segurança tornando o salt "secreto", então você realmente quer mais bits em suas chaves de criptografia.
fonte
A segunda abordagem é apenas um pouco mais segura. Os sais protegem os usuários de ataques de dicionário e de tabelas de arco-íris. Eles tornam mais difícil para um invasor ambicioso comprometer todo o seu sistema, mas ainda são vulneráveis a ataques que se concentram em um usuário do sistema. Se você usar informações disponíveis publicamente, como um número de telefone, e o invasor ficar sabendo disso , você salvou-o de uma etapa do ataque. Claro que a questão é discutível se o invasor obtém todo o seu banco de dados, com sais e tudo.
EDITAR: Depois de reler esta resposta e alguns dos comentários, me ocorre que parte da confusão pode ser devido ao fato de que estou apenas comparando os dois casos muito específicos apresentados na pergunta: sal aleatório vs. sal não aleatório. A questão de usar um número de telefone como um sal é discutível se o invasor obtém todo o banco de dados, e não a questão de usar um sal.
fonte
Do ponto de vista prático, um sal é um detalhe de implementação. Se você alguma vez alterar a forma como as informações do usuário são coletadas ou mantidas - e os nomes de usuário e números de telefone às vezes mudam, para usar seus exemplos exatos -, você pode ter comprometido sua segurança. Você deseja que essa mudança voltada para o exterior tenha preocupações de segurança muito mais profundas?
Interromper a exigência de que cada conta tenha um número de telefone precisa envolver uma análise completa de segurança para garantir que você não abriu essas contas para comprometer a segurança?
fonte
Um sal escondido não é mais sal. É pimenta. Tem seu uso. É diferente do sal.
Pepper é uma chave secreta adicionada à senha + salt que transforma o hash em um HMAC (código de autenticação de mensagem baseado em Hash). Um hacker com acesso à saída do hash e ao salt pode teoricamente adivinhar a força bruta de uma entrada que irá gerar o hash (e, portanto, passar na validação na caixa de texto da senha). Ao adicionar pimenta, você aumenta o espaço do problema de maneira criptograficamente aleatória, tornando o problema intratável sem hardware sério.
Para mais informações sobre pimenta, clique aqui .
Veja também hmac .
fonte
Aqui está um exemplo simples que mostra por que é ruim ter o mesmo sal para cada hash
Considere a seguinte tabela
Caso 1, quando salt 1 é o mesmo que salt2 Se Hash2 for substituído por Hash1, o usuário 2 pode fazer logon com a senha do usuário 1
Caso 2, quando o salt 1 não é o mesmo salt2 Se o Hash2 for substituído por Hash1, o usuário2 não poderá fazer logon com a senha do usuário 1.
fonte
Existem duas técnicas, com objetivos diferentes:
O "sal" é usado para fazer com que duas senhas iguais sejam criptografadas de forma diferente. Dessa forma, um invasor não pode usar com eficiência um ataque de dicionário contra uma lista inteira de senhas criptografadas.
O "segredo" (compartilhado) é adicionado antes do hash de uma mensagem, para que um invasor não possa criar suas próprias mensagens e aceitá-las.
fonte
Tenho tendência a esconder o sal. Eu uso 10 bits de salt acrescentando um número aleatório de 1 a 1024 ao início da senha antes de fazer o hash. Ao comparar a senha que o usuário inseriu com o hash, faço um loop de 1 a 1024 e tento todos os valores possíveis de salt até encontrar a correspondência. Isso leva menos de 1/10 de segundo. Tive a ideia de fazer dessa forma a partir do PHP password_hash e password_verify . No meu exemplo, o "custo" é 10 para 10 bits de sal. Ou pelo que outro usuário disse, "sal" oculto é chamado de "pimenta". O salt não é criptografado no banco de dados. É brutamente forçado a sair. Isso tornaria a tabela de arco-íris necessária para reverter o hash 1000 vezes maior. Eu uso o sha256 porque é rápido, mas ainda é considerado seguro.
fonte
Na verdade, depende do tipo de ataque que você está tentando proteger seus dados.
O objetivo de um salt exclusivo para cada senha é evitar um ataque de dicionário contra todo o banco de dados de senhas.
Criptografar o sal exclusivo para cada senha tornaria mais difícil quebrar uma senha individual, sim, mas você deve pesar se há realmente um benefício. Se o atacante, por força bruta, descobrir que esta string:
hashes para um hash armazenado no banco de dados, é realmente difícil descobrir qual parte é a passagem e qual parte é o sal?
fonte