SHA512 vs. Blowfish e Bcrypt [fechado]

222

Estou analisando algoritmos de hash, mas não consegui encontrar uma resposta.

  • Bcrypt usa Blowfish
  • Blowfish é melhor que MD5
  • P: mas o Blowfish é melhor que o SHA512?

Obrigado..

Atualizar:

Quero esclarecer que entendo a diferença entre hash e criptografia. O que me levou a fazer a pergunta dessa maneira é este artigo , em que o autor se refere a bcrypt como "hash adaptável"

Como o bcrypt é baseado no Blowfish, fui levado a pensar que o Blowfish é um algoritmo de hash. Se é criptografia como as respostas indicaram, parece-me que não deveria ter um lugar neste artigo. O pior é que ele está concluindo que o bcrypt é o melhor. O que também está me confundindo agora é que a classe phpass (usada para hash de senha, acredito) usa bcrypt (por exemplo, blowfish, ou seja, criptografia). Com base nessa nova informação que vocês estão me dizendo (blowfish é criptografia), essa classe parece errada. Estou esquecendo de algo?

Chris
fonte
2
Não está errado; veja as atualizações da minha resposta para obter uma explicação de como o bcrypt funciona e por que ele serve ao mesmo objetivo que um algoritmo "unidirecional" baseado em hash.
Erickson
3
bcryptsimplesmente possui um "fator de trabalho" mais alto por padrão. Presume-se que SHA não ... a menos que você use passhash9, que pode ser usado junto com um fator de trabalho. por que esta pergunta está fechada? está longe de ser respondido, mas é muito importante.
1
O link em questão está inativo ...............
Pacerier

Respostas:

320

Basta dizer se o bcrypt ou o SHA-512 (no contexto de um algoritmo apropriado como PBKDF2) é bom o suficiente . E a resposta é sim, qualquer um dos algoritmos é seguro o suficiente para que uma violação ocorra através de uma falha na implementação, não na análise de criptografia.

Se você insistir em saber o que é "melhor", o SHA-512 recebeu análises detalhadas do NIST e de outros. É bom, mas foram reconhecidas falhas que, embora não sejam exploráveis ​​agora, levaram à competição SHA-3 por novos algoritmos de hash. Além disso, lembre-se de que o estudo dos algoritmos de hash é "mais novo" que o das cifras, e os criptografadores ainda estão aprendendo sobre eles.

Embora o bcrypt como um todo não tenha tido tanto escrutínio quanto o próprio Blowfish, acredito que basear-se em uma cifra com uma estrutura bem compreendida fornece segurança inerente à qual falta a autenticação baseada em hash. Além disso, é mais fácil usar GPUs comuns como uma ferramenta para atacar hashes baseados em SHA-2; por causa de seus requisitos de memória, a otimização do bcrypt requer hardware mais especializado, como FPGA, com alguma memória RAM integrada.


Nota: bcrypt é um algoritmo que usa o Blowfish internamente. Não é um algoritmo de criptografia propriamente dito. É usado para ocultar irreversivelmente senhas, assim como as funções de hash são usadas para fazer um "hash de mão única".

Os algoritmos de hash criptográfico são projetados para serem impossíveis de reverter. Em outras palavras, dada apenas a saída de uma função de hash, deve demorar "para sempre" para encontrar uma mensagem que produza a mesma saída de hash. De fato, deve ser inviável computacionalmente encontrar duas mensagens que produzam o mesmo valor de hash. Ao contrário de uma cifra, as funções de hash não são parametrizadas com uma chave; a mesma entrada sempre produzirá a mesma saída.

Se alguém fornecer uma senha que faça hash no valor armazenado na tabela de senhas, elas serão autenticadas. Em particular, devido à irreversibilidade da função hash, supõe-se que o usuário não seja um invasor que pegou o hash e o reverteu para encontrar uma senha de trabalho.

Agora considere bcrypt. Ele usa o Blowfish para criptografar uma string mágica, usando uma chave "derivada" da senha. Mais tarde, quando um usuário digita uma senha, a chave é derivada novamente e, se o texto cifrado produzido pela criptografia com essa chave corresponder ao texto cifrado armazenado, o usuário será autenticado. O texto cifrado é armazenado na tabela "senha", mas a chave derivada nunca é armazenada.

Para quebrar a criptografia aqui, um invasor precisaria recuperar a chave do texto cifrado. Isso é chamado de ataque "texto sem formatação conhecido", pois o ataque conhece a sequência mágica que foi criptografada, mas não a chave usada. Blowfish foi estudado extensivamente, e ainda não são conhecidos ataques que permitiriam a um invasor encontrar a chave com um único texto simples conhecido.

Assim, assim como algoritmos irreversíveis com base em resumos criptográficos, o bcrypt produz uma saída irreversível, a partir de uma senha, sal e fator de custo. Sua força está na resistência do Blowfish a ataques de texto simples conhecidos, o que é análogo a um "primeiro ataque de pré-imagem" em um algoritmo de resumo. Como ele pode ser usado no lugar de um algoritmo de hash para proteger senhas, o bcrypt é confundidamente referido como o próprio algoritmo "hash".

Supondo que as tabelas do arco-íris tenham sido frustradas pelo uso adequado de sal, qualquer função verdadeiramente irreversível reduz o invasor à tentativa e erro. E a taxa que o invasor pode fazer testes é determinada pela velocidade desse algoritmo irreversível de "hash". Se uma única iteração de uma função hash for usada, um invasor poderá fazer milhões de testes por segundo usando equipamentos que custam cerca de US $ 1000, testando todas as senhas com até 8 caracteres em poucos meses.

Se, no entanto, a digestão for "realimentada" milhares de vezes, levará centenas de anos para testar o mesmo conjunto de senhas nesse hardware. O Bcrypt obtém o mesmo efeito de "fortalecimento de chave" iterando dentro de sua rotina de derivação de chave, e um método baseado em hash adequado como PBKDF2 faz a mesma coisa; a este respeito, os dois métodos são semelhantes.

Portanto, minha recomendação de bcrypt decorre das suposições 1) de que um Blowfish teve um nível de escrutínio semelhante ao da família de funções hash SHA-2 e 2) que métodos criptoanalíticos para cifras são melhor desenvolvidos do que aqueles para funções hash.

erickson
fonte
4
+1 ótima postagem. Mas eu tenho duas perguntas. Blowfish foi substituído por dois há mais de uma década, não deveria um sistema utilizar primitivas modernas? Também milhares de iterações parecem um desperdício em sistemas como aplicativos da Web, onde muitas pessoas estão efetuando login a qualquer momento. Por exemplo, o PBKDF2 é implementado apenas em cenários quando uma pessoa faz logon por vez, como uma função string2key para um sistema de arquivos criptografado. Uso o ditado "Se é muito pesado para o atacante levantar, então é muito pesado para o seu servidor". O que você acha?
rook
17
Acho que não há nada de errado em usar uma primitiva mais moderna. As vulnerabilidades são frequentemente descobertas com o passar do tempo, e o Twofish foi desenvolvido usando o conhecimento adquirido no Blowfish. No entanto, não estou ciente de vulnerabilidades específicas que invalidariam o uso do Blowfish, portanto, um argumento "se não está quebrado" também pode ser feito. Seu ditado sobre atacantes não me parece bom. Mesmo se você escolher um algoritmo que levaria anos para um invasor testar um bilhão de senhas, ele consumirá uma fração insignificante de tempo em um aplicativo legítimo.
21410 Erickson #
15
Se você observar as especificações de qualquer função hash, não verá nada sobre "salt". O único parâmetro é a mensagem a ser digerida. Revise a especificação de qualquer cifra e você verá que a função está parametrizada com uma tecla. O "salt" que pode (ou não ) ser usado em conjunto com um hash é simplesmente parte da mensagem. O algoritmo de hash não exige, não o trata especialmente e não pode diferenciá-lo do restante da mensagem. Portanto, embora seja verdade que as mensagens geralmente são alteradas pela salga, uma determinada mensagem produz apenas um hash.
Erickson
1
@Andre D Como editor, relato aplicativos que bloqueiam contas, ei Relato aplicativos que não impedem a força bruta. Idealmente, um endereço IP incorreto deve resolver um captcha, além disso, se um nome de usuário for direcionado (mesmo que esse nome de usuário não exista), essa conta deverá resolver um captcha antes da autenticação. Também é aceitável forçar um limite de X por minuto. Relacionado: security.stackexchange.com/questions/25444/…
rook
2
@rook: embora as aplicações com limitação de ratos sejam boas práticas, você pode assumir, neste caso, que o banco de dados foi baixado e colocado em equipamentos que não possuem o limite de taxa que você descreve.
Ellert van Koperen
50

Concordo com a resposta de Erickson, com uma ressalva: para fins de autenticação de senha, o bcrypt é muito melhor que uma única iteração do SHA-512 - simplesmente porque é muito mais lento. Se você não entender por que a lentidão é uma vantagem nesse jogo em particular, leia o artigo ao qual você vinculou novamente (role para baixo até " Velocidade é exatamente o que você não quer em uma função de hash de senha ").

É claro que você pode criar um algoritmo de hash de senha seguro em torno do SHA-512 iterando-o milhares de vezes, exatamente como o algoritmo MD5 do PHK funciona. Ulrich Drepper fez exatamente isso , para a cripta da glibc (). Porém, não há nenhuma razão específica para fazer isso, se você já tiver uma implementação de bcrypt testada disponível.

caf
fonte
3
Espero que minha resposta deixe claro que uma única iteração de hash não é suficiente (infelizmente, mesmo esse nível rudimentar de conhecimento não pode ser assumido). "Se uma única iteração de uma função de hash for usada, um invasor poderá fazer milhões de testes por segundo usando equipamentos que custam cerca de US $ 1000, testando todas as senhas com até 8 caracteres em poucos meses. Se, no entanto, o resumo é emitido é 'realimentado' milhares de vezes, levará centenas de anos para testar o mesmo conjunto de senhas nesse hardware. O Bcrypt obtém o mesmo efeito de 'fortalecimento de chave' iterando ... "
erickson
@ erickson: Sim, embora eu ache que você possa ter enterrado o lede lá. O ponto que eu estava tentando destacar é que uma comparação direta de bcrypt e SHA-512 não é realmente relevante, porque uma é uma função de derivação de chave e a outra é apenas uma primitiva criptográfica, inadequada por si só.
caf
1
O uso de milhares de rodadas de SHA-512 não é inédito e, dada a sua inclusão em várias cryptimplementações (inclusive no PHP que eu uso), quando li a pergunta original, até assumi que era o que o OP queria dizer quando perguntou sobre o SHA-512 - que ele estava realmente se referindo a milhares de rodadas de SHA-512 vs bcrypt, que usa centenas ou milhares de iterações.
thomasrutter
33

Blowfish não é um algoritmo de hash. É um algoritmo de criptografia. O que isso significa é que você pode criptografar algo usando blowfish e, posteriormente, descriptografá-lo novamente em texto sem formatação.

SHA512 é um algoritmo de hash. Isso significa que (em teoria), uma vez que você hash a entrada, você não poderá obter a entrada original novamente.

São duas coisas diferentes, projetadas para serem usadas em tarefas diferentes. Não existe uma resposta 'correta' para "o blowfish é melhor que o SHA512?" Você também pode perguntar "maçãs são melhores que cangurus?"

Se você quiser ler mais sobre o assunto, aqui estão alguns links:

Glen
fonte
18
Acho que a pergunta é sobre o uso do bcrypt como uma proteção irreversível para senhas, da mesma forma que o hash é usado para esse fim.
22610 erickson
3
@erickson o texto "P: mas o Blowfish é melhor que o SHA512?" parece bastante claro para mim e mostra que o OP não entender as diferenças entre os 2 algoritmos
Glen
1
OP aqui. Na verdade, com base na resposta de Glen de que blowfish é um algoritmo de criptografia (que eu entendo é diferente de hash), percebo agora que minha pergunta sim foi confusa. O que é confuso agora é que a classe phpass (usada para hash de senha, acredito) usa bcrypt (por exemplo, blowfish, ou seja, criptografia). Se blowfish é criptografia, como o phpass o usa para hash senhas parece uma falha para mim, não? Estou esquecendo de algo?
Chris
2
no entanto, a pergunta é qual das maçãs e cangurus é mais adequada para uma tarefa específica. Blowfish é uma função de hash melhor que sha por causa do tempo que leva para o hash. A maioria das implementações de sha que eu vi são muito rápidas. Você deseja um algoritmo lento para o hash de senha.
John
Esta resposta está correta: o Blowfish é um algoritmo de criptografia, mas, neste contexto (por exemplo, quando usado bcrypt), ele é usado como um algoritmo de hash derivando uma chave da string de origem e usando-a para criptografar um número mágico. Isso o torna irreversível, essencialmente uma função de hash. Você não pode calcular a chave a partir de uma cifra, mesmo que conheça o texto sem formatação e os dados criptografados.
thomasrutter
4

Blowfish não é melhor que MD5 ou SHA512, pois eles servem a propósitos diferentes. MD5 e SHA512 são algoritmos de hash, o Blowfish é um algoritmo de criptografia. Duas funções criptográficas completamente diferentes.

blowdart
fonte
2

Eu recomendaria a implementação de criptografia baseada em SHA-256 / SHA-512 de Ulrich Drepper.

Nós portamos esses algoritmos para Java, e você pode encontrar uma versão licenciada deles em ftp://ftp.arlut.utexas.edu/java_hashes/ .

Observe que a maioria dos Unices (L) modernos suporta o algoritmo do Drepper em seus arquivos / etc / shadow.

Jonathan Abbey
fonte
O PWDTK sourceforge.net/projects/pwdtknet usa o HMAC-SHA512, no entanto, ele faz isso em várias iterações para criar "lentidão", conhecida como Key Stretching, como outros aqui têm falado. O BCrypt é melhor que um único SHA-512, como mencionado, no entanto, se você usar o SHA-512 em algo como PBKDF2, estará bem seguro (desde que você esteja usando um sal cripto-aleatório grande e iterações suficientes para forçar tempo para fazer uma tabela do arco-íris) da API Acabei de publicar é construído por mim e vai fazer o que quiser em .NET se é isso que você está desenvolvendo para (para leitores futuros benefício)
thashiznets
2

Eu me deparei com isso:

http://codahale.com/how-to-safely-store-a-password/

O autor deste artigo pode estar errado?

desapareceu
fonte
2
Não é que ele esteja errado, é apenas que ele está ignorando uma grande quantidade de literatura sobre como aplicar algoritmos de hash, viz. eles devem ser usados ​​iterativamente nas funções de derivação de chaves, assim como o bcrypt.
21711 Erickson #