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?
Respostas:
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.
fonte
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.
fonte
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?
fonte
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.
fonte
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.
fonte
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.
fonte
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.
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.
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.
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.
fonte
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.
fonte
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'.
fonte