Tip:
Highlight text to annotate it
X
Existem muitos algoritmos de hash populares. É claro que podemos
escrever o nosso, mas nunca deveríamos fazer isso.
A primeira lição que se aprende no CS387
é que não devemos escrever o nosso próprio algoritmo --
pelo menos não para os nossos objetivos.
É claro que, se estivermos construindo uma tabela hash,
podemos fazer o que bem entendermos.
Mas, se formos utilizá-lo para fins de segurança,
é melhor não escrever um algoritmo pessoal.
Mas, se quiser aprender a construir uma tabela hash, vá em frente.
É claro que alguém, muito provavelmente, já fez uma melhor. Mas nunca se sabe...
Enfim, alguns algoritmos populares são o CRC32, que é, basicamente,
usado em checksum
Se formos enviar um monte de dados a alguém -- um arquivo grande --
podemos incluir um CRC deste arquivo. Esta é uma maneira simples de verificar
se recebemos o arquivo por completo e se ele não está corrompido.
Isso porque é mais fácil enviar uma hash do que enviar um arquivo inteiro.
É possível copiar e colar uma hash. São só alguns bits.
Pode-se verificar se o arquivo recebido tem o mesmo CRC do arquivo enviado.
Assim, não é preciso verificar cada bit
para sabermos se recebemos o arquivo certo.
O CRC é bem rápido. Seu único objetivo é fazer verificações.
Basicamente, criar uma hash de um arquivo grande.
Suas propriedades de segurança não são tão boas. É muito fácil encontrar
o que chamamos de colisões, que acontece quando dois objetos
apontam para o mesmo valor.
O objetivo da hash é obtermos valores diferentes
para quase tudo em que usamos a hash.
Obviamente, se o valor de entrada é substancialmente
maior do que o valor de saída, o resultado serão colisões.
O problema é que elas são difíceis de encontrar.
Mas com o CRC32 isso se torna fácil. O motivo de se usar CRC
é que nós não nos importamos com colisões, nos importamos com velocidade.
E o CRC é bem veloz.
O algoritmo hash mais popular ainda é o MD5, que costumava ser usado
porque era razoavelmente rápido -- não tão rápido quanto CRC32 --
mas bem rápido e as pessoas achavam que ele era bem seguro. Mas não é.
MD5 foi invadido várias vezes nos últimos anos
e é muito fácil de encontrar colisões de MD5.
Usando o hash sobre um "x" que dá o seu valor em "y",
é muito simples, dado esse "y", encontrar outro "x" que deposita seu valor nele,
o que é, como veremos, um problemão. Não usaremos muito MD5 nessa aula.
Bem, ele tem as suas utilidades.
Se tivermos dados limitados de entrada é muito difícil haver uma colisão.
Há certos tipos de ataques, como o de fazer o "x" cada vez maior.
Este é um bom método de encontrar uma colisão no MD5.
Mas se o comprimento de "x" for limitado,
não precisamos nos preocupar demais com essa vunerabilidade.
Enfim, tenha isso em mente.
Se os dados forem realmente importantes, não use MD5.
O segundo hash mais popular é chamado de SHA-1.
Ele não é tão rápido, mas ele tem uma segurança razoável.
É só agora que estamos ouvindo falar
de demonstrações de pessoas encontrando colisões no SHA-1.
Ainda é muito bom. É a segunda hash mais usada depois do MD5.
Mas para fazer as coisas andarem mesmo, devemos usar algo como,
por exemplo, o SHA-256, que é, como você deve ter concluído,
apenas uma versão maior do SHA-1.
Mas na verdade não é. Acredito que o algoritmo também mudou.
Digamos que este tem uma segurança razoável. Mas que este é muito bom.
Isso vai levar algum tempo.
É claro que a velocidade dele é menor.
Quão melhor o algoritmo hash for hoje em dia, mais lento ele vai ser.
Estes aqui estão organizados por custo e segurança.
Assim, não haverá nenhuma grande surpresa
se houver uma correlação inversa entre custo e segurança.
Mas é assim que funciona.
Então, dependo do problema em que estivermos trabalhando,
talvez tenhamos de tomar uma decisão.
Mas para os nossos objetivos, não teremos muito trânsito de informações.
Provavelmente usaremos o SHA-256 para a maioria das coisas.
Deixe-me mostrar-lhe como usaríamos isso.