Diferença entre Hashing uma senha e criptografar


140

O atual melhor votado para esta pergunta afirma:

Outro problema que não é tanto um problema de segurança, embora seja relacionado à segurança, é completo e falha abjeta em entender a diferença entre colocar uma senha em hash e criptografá-la . Mais comumente encontrado no código em que o programador está tentando fornecer a funcionalidade insegura "Lembre-me da minha senha".

O que exatamente é essa diferença? Eu sempre tive a impressão de que o hash era uma forma de criptografia. Qual é a funcionalidade não segura a que o pôster está se referindo?


Um artigo bem escrito sobre o motivo pelo qual você não deve simplesmente misturar segredos / senhas. Em vez disso, use o HMAC. benlog.com/articles/2008/06/19/dont-hash-secrets
Jay Kumar

Excelente resumo do assunto no blog de segurança do StackExchange: security.blogoverflow.com/2011/11/…
David J. Liszewski

@ JayKumar: O artigo que você vinculou é muito enganador. Ele combina sais de senha (que devem ser visíveis para os invasores) com chaves MAC (que devem permanecer em segredo). O link de David J. Liszewski fornece uma descrição muito mais precisa.
Rufflewind

Respostas:


222

Hashing é uma função de mão única (bem, um mapeamento). É irreversível, você aplica o algoritmo de hash seguro e não pode recuperar a string original. O máximo que você pode fazer é gerar o que é chamado de "colisão", ou seja, encontrar uma sequência diferente que forneça o mesmo hash. Os algoritmos de hash criptograficamente seguros são projetados para evitar a ocorrência de colisões. Você pode atacar um hash seguro usando uma tabela arco - íris , que pode ser combatida aplicando sal ao hash antes de armazená-lo.

A criptografia é uma função adequada (bidirecional). É reversível, você pode descriptografar a string mutilada para obter a string original, se tiver a chave.

A funcionalidade insegura a que se refere é que, se você criptografar as senhas, seu aplicativo tem a chave armazenada em algum lugar e um invasor que obtém acesso ao seu banco de dados (e / ou código) pode obter as senhas originais obtendo a chave e o texto criptografado. , enquanto que com um hash é impossível.

As pessoas costumam dizer que, se um cracker possui seu banco de dados ou seu código, ele não precisa de uma senha, portanto a diferença é discutível. Isso é ingênuo, porque você ainda tem o dever de proteger as senhas de seus usuários, principalmente porque a maioria deles usa a mesma senha repetidamente, expondo-os a um risco maior ao vazar suas senhas.


1
Para ficar claro, obtenha a segurança desejada com o hash, ele deve ser um algoritmo de hash criptograficamente seguro com a propriedade específica que não apenas o hash seja não reversível, mas TAMBÉM impraticável em termos computacionais para gerar QUALQUER outra string que gere o mesmo hash.
Alto Jeff

11
Sim e não ... As colisões de hash precisam ser difíceis de gerar para garantir a segurança de seu próprio aplicativo, mas a reversibilidade é suficiente para evitar o vazamento de senha.
Dave Sherohman

5
sedoso: e como exatamente você receberá a senha original de volta da sua péssima função de hash? Eu sugiro que você reler o comentário de Dave
Vinko Vrsalovic

1
Se alguma coisa, uma função de hash com um grande número de colisões é melhor para a segurança das senhas, no entanto, obviamente, isso significa que mais senhas podem ser usadas para fazer login na conta.
Williamvicary

1
O sal do n00b não pode ser codificado, porque cada item com hash deve usar um sal separado. O ponto principal é que, tanto o UsuárioA quanto o UsuárioB usam a senha "1234", se você descobrir a senha do UsuárioA, não poderá dizer ao UsuárioB que usou a mesma senha porque eles tinham sais diferentes. Não é essencial para a segurança que um sais seja mantido em segredo; a maioria das implementações apenas concatena o sal na frente ou na parte traseira do blob binário que representa o hash.
Scott Chamberlain

34

O hash é uma função unidirecional, o que significa que, depois de hash uma senha, é muito difícil recuperar a senha original do hash. A criptografia é uma função de mão dupla, na qual é muito mais fácil recuperar o texto original do texto criptografado.

O hash simples é facilmente derrotado usando um ataque de dicionário, em que um invasor pré-hashes todas as palavras em um dicionário (ou toda combinação de caracteres até um determinado comprimento) e, em seguida, usa esse novo dicionário para procurar senhas em hash. O uso de um sal aleatório exclusivo para cada senha com hash armazenada torna muito mais difícil para um invasor usar esse método. Eles basicamente precisariam criar um novo dicionário exclusivo para cada valor de sal que você usar, retardando terrivelmente o ataque.

Não é seguro armazenar senhas usando um algoritmo de criptografia, porque se for mais fácil para o usuário ou o administrador recuperar a senha original do texto criptografado, também é mais fácil para o invasor fazer o mesmo.


12

Senhas criptografadas vs com hash

Como mostrado na imagem acima, se a senha é criptografada, é sempre um segredo oculto onde alguém pode extrair a senha em texto sem formatação. No entanto, quando a senha é hash, você fica relaxado, pois praticamente não há método de recuperar a senha do valor do hash.


Extraído de senhas criptografadas x senhas hash - Qual é melhor?

A criptografia é boa?

As senhas de texto simples podem ser criptografadas usando algoritmos de criptografia simétrica como DES, AES ou com qualquer outro algoritmo e ser armazenadas dentro do banco de dados. Na autenticação (confirmando a identidade com nome de usuário e senha), o aplicativo decriptografará a senha criptografada armazenada no banco de dados e comparará com a senha fornecida pelo usuário para garantir a igualdade. Nesse tipo de abordagem de manipulação de senha, mesmo que alguém tenha acesso às tabelas do banco de dados, as senhas não serão simplesmente reutilizáveis. No entanto, há más notícias nessa abordagem também. Se, de alguma forma, alguém obtiver o algoritmo criptográfico junto com a chave usada pelo seu aplicativo, ele poderá visualizar todas as senhas de usuário armazenadas no banco de dados por decriptografia. "Essa é a melhor opção que eu tenho", um desenvolvedor de software pode gritar, mas existe uma maneira melhor?

Função hash criptográfica (somente de sentido único)

Sim, existe, pode ser que você tenha esquecido o ponto aqui. Você notou que não há necessidade de descriptografar e comparar? Se houver uma abordagem de conversão unidirecional, em que a senha possa ser convertida em alguma palavra convertida, mas a operação reversa (geração de senha a partir da palavra convertida) será impossível. Agora, mesmo que alguém obtenha acesso ao banco de dados, não há como as senhas serem reproduzidas ou extraídas usando as palavras convertidas. Nessa abordagem, dificilmente haverá alguém que saiba as senhas secretas dos usuários; e isso protegerá os usuários usando a mesma senha em vários aplicativos. Quais algoritmos podem ser usados ​​para essa abordagem?


Ok, mas quando você faz login em um serviço, sua senha é enviada em texto sem formatação / criptografada, porque se for enviada como um hash para o servidor a ser comparado. um hacker poderia, se conhecer o hash, basta enviá-lo ao servidor para fazer login. É por isso que as senhas para comparação precisam ser enviadas criptografadas para o servidor, onde são descriptografadas e com hash. Isso é seguro, certo? Contanto que as senhas nunca sejam armazenadas no formato unificado por longo prazo e todas as ocorrências de senhas criptografadas / de texto sem formatação sejam apagadas de qualquer memória quando não forem mais necessárias?
AgentM

8

Sempre pensei que a criptografia pode ser convertida nos dois sentidos, de maneira que o valor final possa levá-lo ao valor original e, com o Hashing, você não poderá reverter do resultado final para o valor original.


8

Os algoritmos de hash são geralmente de natureza criptográfica, mas a principal diferença é que a criptografia é reversível através da descriptografia, e o hash não.

Uma função de criptografia normalmente recebe entrada e produz uma saída criptografada com o mesmo tamanho ou tamanho um pouco maior.

Uma função de hash recebe entrada e produz uma saída tipicamente menor, geralmente de tamanho fixo.

Embora não seja possível obter um resultado de hash e "deshash" para recuperar a entrada original, você pode tipicamente forçar seu caminho para algo que produz o mesmo hash.

Em outras palavras, se um esquema de autenticação pegar uma senha, fazer hash e compará-la com uma versão com hash da senha requerida, talvez não seja necessário que você realmente conheça a senha original, apenas seu hash, e possa usar força bruta seu caminho para algo que corresponda, mesmo que seja uma senha diferente.

As funções de hash são normalmente criadas para minimizar as chances de colisões e dificultar o cálculo de algo que produzirá o mesmo hash que qualquer outra coisa.


4

Idealmente, você deve fazer as duas coisas.

Primeiro Hash a senha de passe para a segurança unidirecional. Use sal para segurança extra.

Em seguida, criptografe o hash para se defender contra ataques de dicionário se seu banco de dados de hashes de senha estiver comprometido.


3
Criptografá-lo com o quê? Se eles o atacassem tanto que chegavam ao banco de dados com todas as senhas de seus usuários (hash, criptografadas ou não), eles não conseguiriam encontrar a chave para descriptografá-los?
Luc

5
Isso não deve ser prejudicado. É uma possibilidade que não deve ser descartada tão fácil, que o banco de dados seja comprometido enquanto o aplicativo não. Portanto, criptografar o hash é uma camada extra de segurança.
Arie

@ Luc Eu discordo de você, meu eu anterior. Já vi muitas injeções de SQL que não comprometiam o código do aplicativo (ou arquivos de configuração) e agora sou da opinião de que adicionar um segredo é útil, seja na forma de criptografia ou na forma de pimenta, mas não deve substituir o hash. Para obter uma resposta mais completa, consulte aqui: security.stackexchange.com/a/31846/10863
Luc

3

Hashing :

É um algoritmo unidirecional e, uma vez que o hash não pode reverter, esse é o ponto ideal contra a criptografia.

Criptografia

Se executarmos a criptografia, haverá uma chave para fazer isso. Se essa chave vazar, todas as suas senhas poderão ser descriptografadas facilmente.

Por outro lado, mesmo que seu banco de dados seja invadido ou o administrador do servidor tenha coletado dados do banco de dados e você tenha usado senhas com hash, o hacker não poderá quebrar essas senhas. Isso seria praticamente impossível se usarmos hash com sal adequado e segurança adicional com o PBKDF2.

Se você quiser dar uma olhada em como você deve escrever suas funções de hash, visite aqui .

Existem muitos algoritmos para executar o hash.

  1. MD5 - Usa a função de hash MD5 (Message Digest Algorithm 5). O hash de saída tem 128 bits de comprimento. O algoritmo MD5 foi desenvolvido por Ron Rivest no início dos anos 90 e não é a opção preferida atualmente.

  2. SHA1 - Usa o hash do algoritmo de hash de segurança (SHA1) publicado em 1995. O hash de saída tem 160 bits. Embora seja mais amplamente usada, hoje não é uma opção preferida.

  3. HMACSHA256 , HMACSHA384 , HMACSHA512 - Use as funções SHA-256, SHA-384 e SHA-512 da família SHA-2. O SHA-2 foi publicado em 2001. Os comprimentos de hash de saída são 256, 384 e 512 bits, respectivamente, como os nomes das funções de hash indicam.


1

Por mais corretas que sejam as outras respostas, no contexto em que a cotação estava, o hash é uma ferramenta que pode ser usada para proteger informações, a criptografia é um processo que coleta informações e dificulta a leitura / utilização de pessoas não autorizadas.


-9

Aqui está um motivo pelo qual você pode querer usar um sobre o outro - recuperação de senha.

Se você armazenar apenas um hash da senha de um usuário, não poderá oferecer o recurso 'senha esquecida'.


16
Você obviamente não leu a resposta aceita o suficiente. Leia com atenção: você não deve oferecer um recurso de recuperação de senha . Você deveria oferecer um recurso de redefinição de senha . Administro muitos sites há anos, incluindo vBulletin, phpBB, e107, IPB, blogspot e até mesmo meu próprio CMS personalizado. Como administrador, você NUNCA precisa ter a senha pré-hash de alguém. Você simplesmente não. E você também não deveria ter. Se você não concorda com o que estou dizendo, garanto-lhe: você está errado.
Lakey

3
Desculpe por estar MUITO bravo. Acabo de ver muitos sites armazenar senhas em texto simples e isso me frustra. Como uma observação lateral: alguns sites preocupados com a segurança gostam de fazer com que os usuários alterem suas senhas periodicamente. Eles querem garantir que a pessoa não altere sua senha de "Senha1" para "Senha2". Portanto, eles mantêm a senha em texto sem formatação para fazer essas comparações posteriormente. Isso não é uma boa prática. O que eles precisam fazer, nesse caso, é executar a análise da senha PRIMEIRO, criando várias senhas semelhantes - hash cada uma - e armazenando apenas os hashes .
Lakey

7
Não tem problema, ele me fez voltar a ler a pergunta e também fazer pesquisas adicionais, para que nem tudo estivesse perdido :-) Não tenho certeza do que estava pensando quando escrevi essa resposta. Abraço
Philtron
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.