Diferença entre o hashing de uma senha e a criptografia

O atual mais votado nesta questão declara:

Outro que não é tanto um problema de segurança, embora esteja relacionado à segurança, é uma falha completa e abjeta para aumentar a diferença entre criptografar uma senha e criptografá-la . Mais comumente encontrado no código em que o programador está tentando fornecer uma funcionalidade “Lembrar minha senha” insegura.

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

Hashing é uma function unidirecional (bem, um mapeamento). É irreversível, você aplica o algoritmo de hash seguro e não consegue recuperar a string original. O máximo que você pode fazer é gerar o que é chamado de “colisão”, isto é, encontrar uma string diferente que forneça o mesmo hash. Algoritmos hash criptograficamente seguros são projetados para evitar a ocorrência de colisões. Você pode atacar um hash seguro usando uma mesa de arco – íris , que você pode neutralizar aplicando um sal ao hash antes de armazená-lo.

A criptografia é uma function adequada (de duas vias). É 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 access a seu database (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 database 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 várias vezes, expondo-as a um risco maior ao vazar suas senhas.

O hash é uma function unidirecional, o que significa que, uma vez que você hash uma senha, é muito difícil recuperar a senha original do hash. A criptografia é uma function bidirecional, em que é muito mais fácil recuperar o texto original do texto criptografado.

O hashing simples é facilmente derrotado usando um ataque de dictionary, em que um invasor apenas pré-hashes de cada palavra de um dictionary (ou de todas as combinações de caracteres até um certo tamanho) e, em seguida, usa esse novo dictionary para procurar senhas com hash. Usar um sal random exclusivo para cada senha armazenada em hash torna muito mais difícil para um invasor usar esse método. Eles basicamente precisariam criar um novo dictionary único para cada valor de sal que você usa, diminuindo o seu ataque terrivelmente.

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

Eu sempre pensei que a criptografia pode ser convertida nos dois sentidos, de uma forma que o valor final pode trazer-lhe o valor original e com o Hashing você não será capaz de reverter do resultado final para o valor original.

Senhas criptografadas vs hash

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


Extraído de Senhas Encriptadas vs Hashed – Qual é o 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 armazenadas no database. Na autenticação (confirmando a identidade com o nome de usuário e senha), o aplicativo irá descriptografar a senha criptografada armazenada no database e comparar com a senha fornecida pelo usuário para a igualdade. Nesse tipo de abordagem de manipulação de senha, mesmo que alguém tenha access a tabelas de database, as senhas não serão simplesmente reutilizáveis. No entanto, há uma má notícia nesta abordagem também. Se, de alguma forma, alguém obtiver o algoritmo criptográfico juntamente com a chave usada pelo seu aplicativo, ele poderá visualizar todas as senhas armazenadas no database por descriptografia. “Esta é 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 uma via)

Sim, há, pode ser que você tenha perdido o ponto aqui. Você percebeu que não há necessidade de decifrar e comparar? Se houver uma abordagem de conversão unidirecional onde a senha pode ser convertida em alguma palavra convertida, mas a operação inversa (geração de senha da palavra convertida) é impossível. Agora, mesmo que alguém tenha access ao database, não há como as senhas serem reproduzidas ou extraídas usando as palavras convertidas. Nessa abordagem, dificilmente, de qualquer maneira, alguns poderiam conhecer as senhas secretas de seus usuários; e isso protegerá os usuários usando a mesma senha em vários aplicativos. Quais algoritmos podem ser usados ​​para essa abordagem?

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

Uma function de criptografia geralmente recebe input e produz saída criptografada que é o mesmo ou um tamanho ligeiramente maior.

Uma function hash recebe input e produz uma saída tipicamente menor, normalmente também de tamanho fixo.

Embora não seja possível obter um resultado com hash e “dehash” para recuperar a input original, você pode normalmente forçar o seu caminho para algo que produza o mesmo hash.

Em outras palavras, se um esquema de autenticação usa uma senha, o hashes e a compara a uma versão com hash da senha exigida, talvez não seja necessário que você realmente conheça a senha original, apenas seu hash e você pode usar a força bruta. o seu caminho para algo que irá corresponder, mesmo que seja uma senha diferente.

Normalmente, as funções de hashing são criadas para minimizar a chance de colisões e dificultar o cálculo de algo que produza o mesmo hash que outra coisa.

Hashing :

É um algoritmo unidirecional e uma vez hashed não pode reverter e este é o seu ponto doce contra a criptografia.

Encriptação

Se executarmos criptografia, haverá uma chave para fazer isso. Se esta chave for vazada, todas as suas senhas poderão ser descriptografadas facilmente.

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

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

Existem muitos algoritmos para executar hashing.

  1. MD5 – Usa a function de hash Message Algorithm 5 (MD5). O hash de saída tem 128 bits de comprimento. O algoritmo MD5 foi projetado por Ron Rivest no início dos anos 90 e hoje não é uma opção preferida.

  2. SHA1 – Usa hash Algoritmo de hash de segurança (SHA1) publicado em 1995. O hash de saída tem 160 bits de comprimento. Embora seja o mais amplamente utilizado, esta não é uma opção preferida hoje.

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

Tão correta quanto as outras respostas podem ser, no contexto em que a citação estava, o hashing é uma ferramenta que pode ser usada para proteger informações, a criptografia é um processo que leva informações e dificulta a leitura / uso de pessoas não autorizadas.

Idealmente, você deve fazer as duas coisas.

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

Em seguida, criptografe o hash para se defender contra ataques de dictionary se o database de hashes de senha estiver comprometido.

Aqui está uma das razões pelas quais você pode querer usar uma sobre a outra – recuperação de senha.

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