MD5 – Confira a integridade dos ficheiros
Noutro dia em conversa com um colega, ele questionava-me para que servia um número grande que era fornecido em determinados sites (por exemplo, no site onde se faz download do Ubuntu). Depois de reflectir sobre que número seria esse, cheguei a conclusão que ele falava das hashes MD5. Para lhe explicar qual o objectivo dessa hash (chave sumário), comecei por lhe fazer a seguinte pergunta:
Como é que sabes que o ficheiro que fizeste download não possui erros e é efectivamente o que está no site?
Pois bem, de forma a conferir a integridade de um determinado ficheiro/conteúdo, foi criado o MD5.
O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321. Por ser um algoritmo unidirecional, um hash MD5 não pode ser transformado novamente na password (ou texto) que lhe deu origem.
Como funciona?
- O emissor e o receptor escolhem uma função de Hash;
- O emissor envia a mensagem em conjunto com o sumário;
- O receptor calcula o seu próprio sumário e compara com o original. No caso de não serem iguais, comprova-se que a mensagem foi modificada em trânsito
Por exemplo, imaginem que eu quero fazer download de uma distribuição Ubuntu Linux. Depois de fazer o download do ficheiro .iso, calculo a hash desse mesmo ficheiro e comparo com as hash divulgada no próprio site. Este tipo de informação é também comum em sites P2P.
Exemplo 1
Por exemplo, vamos considerar que vamos fazer download de um ficheiro e quem tem o seguinte hash (informação a vermelho). Usei o transmition para efectuar o download do ficheiro.
Depois de efectuado o dowload, pode-se aceder às propriedades do ficheiro e confirmar se o hash é o mesmo para conferir assim a integridade do ficheiro.
Exemplo 2 – Conferir a integridade com md5sum
Para conferirmos a integridade via linha de comandos, podemos usar o comando md5sum. Em termo de exemplo, vamos verificar a integridade de uma imagem do Linux através do calculo do seu hash e comparando com o hash disponibilizado no site UbuntuHashes
Como podemos verificar pelo exemplo anterior, o ficheiro que temos é efectivamente o que estava disponível no site do Ubuntu.
O MD5 é um excelente algoritmo que como já referido permite obter um “sumário” de toda a informação.
Lembram-se daquele dígito que vem nos bilhetes de identidade mais antigos e que o pessoal dizia que era o número de nomes iguais? Bem, o significado não é bem esse :), basicamente aquilo é um digito de validação que permite validar o número do BI, que após uma fórmula nos dá aquele valor.
O MD5 funciona de forma idêntica, pois criamos uma hash e validamos se efectivamente é esse o ficheiro. Assim temos a certeza se o mesmo ficheiro tem erros ou foi alterado num processo de transferência.
Este artigo tem mais de um ano
Não sabia que o Ubuntu tinha suporte a hash-checking. Interessante! Em Windows uso o programa Hash para analisar e comparar hashes de ficheiros. Está disponível em http://keir.net
Eheheh… curiosamente, foi em ambientes Linux que conheci primeiros os “hash checks” e, só mais tarde, em Windows. Isto faz-me lembrar os velhos tempos da Usenet em que os mais “desconfiados” usavam assinaturas PGP…
Mas creio que para além de validarem a *origem* do download, estas chaves permitem igualmente verificar se o mesmo foi 100% conseguido. Ou seja, até se pode ter descarregado um ISO da origem fidedigna mas, se por qualquer motivo o download não foi completamente terminado, o checksum não coincidirá.
Já me aconteceu isso ao “sacar” um ISO Linux do Darkstar e, embora o tamanho final parecesse “legal”, o checksum não coincidia. Abrindo o ISO verifiquei que havia diversos ficheiros e pastas com tamanho zero. Algo fez abortar o download mas o tamanho final do ISO descarregado era enganosamente semelhante…
Sugeriste um programa porreiro! Obrigado! Já cá canta!
BI
por exemplo, o numero: 12345678 5
começando da direita para a esquerda
5*1 + 5*8 + 5*7 + … = 209
209 mod 11 = 0
Este numero terá de ser divisivel por 11. Ou seja não é mais que um caracter de controlo. Para o pessoal da electronica/informatica é uma especie de checksum ou um CRC. Existem vários algoritmos deste tipo. Tudo o que é cartão utiliza um caracter no fim deste genero. Desde cartões multibanco/credito, cartoes magnéticos de tudo e mais alguma coisa etc. Os protocolos de comunicação também tem um conjunto de caracteres no final para validar se a transmissão foi ok
Para quem não percebeu. Imaginem que uma senhora numa repartição de finanças que está a digitar o numero do BI. Se o software estiver bom feito, obrigará a introdução do ultimo digito. O Software só terá de fazer o calculo e validar se foi introduzido correctamente
o algoritmo do BI tem uma pequena nuance que muita gente diz que é erro. São apenas uns totós que nada percebem do assunto e gostam de mandar uns bitaites. A nuance é que a divisão por 11 pode produzir numeros entre 0 e 10 inclusive. Coloca-se a questão então de como representar o 10. Optou-se por representa-lo também por 0. Assim na formula de calculo o 0 tanto pode ser um 0 ou 10. Mas, como o algoritmo é apenas um verificador de erros não fará nada mais do que para o caso do 0 fazer as duas validações
Boas!
Visto que sabes do assunto, sabes dizer também a que corresponde o código à frente do número do cartão de cidadão?
Obrigado
Tb tenho curiosidade!
“Mas, como o algoritmo é apenas um verificador de erros não fará nada mais do que para o caso do 0 fazer as duas validações”
Não é muito boa solução. Se o valor do resto não fosse crítico, retirava-se o resto e verificava-se os casos todos…Quem critica essa questão tem razão.
Há uma solução simples: é não emitir BIs com o número divisível por 11. Não sei se usam esse método mas é a solucção posssível sem modificar muito o sistema instalado. Em minha opinião não vejo porque não usam este método.
Mais complicado era por um X se o resto for 10 (método muito usado, X=10).
Ou então terem estudado a lição do princípio e usarem o algoritmo de Verhoeff ou outro suficientemente poderoso.
colocar outro digito só vinha complicar. O Algoritmo pode ser feito ignorando o primeiro o caracter de controlo e no final fazer a validação. Ou seja entre fazer uma comparação com 0 ou 10 ou atribuir o valor X a 10 é igual computacionalmente, só que o X ou outro caracter só vinha complicar (hoje em dia não)
Não esquecer que na altura em que foi implementado, algoritmos mais complexos não eram execuiveis para sistemas embebidos. O checksum é muito menos eficaz e, mesmo assim, por vezes não era implementado devido à carga computacional exigida (que não era mais xors ou somas)
estes dias estava a implementar um algoritmo para validação de corrupção ficheiros. Ainda equacionei a implementação do MD5, mas optei por algo mais bacoco que era mais que suficiente
No MacOSX existe o comando ‘md5’ que imprime no ecrã o hash de um ficheiro.
Muito boa a explicação sobre MD5, mas gostaria de alertar que se alguém precisar de segurança nesses hashes é bom pensar em algoritmos com saída maior do que 128 bits.
Ter uma saída de 128 bits significa que serão necessários 2^64 passos para encontrar uma mensagem m1 diferente de m2 que possua a mesma saida de hash, isso significa insegurança!
Hoje é recomendado ter uma saída de pelo menos 256 bits. Um algoritmo que pode ajudar é o SHA-2 (256, 384, 512 bits de saída).
Bom Alerta!
@Cleber, queres escrever um artigo sobre SHA ou SHA-2? Se sim, envia e-mail para mim.
Abraço
Há 2 coisas diferentes.
Uma proteger um ficheiro contra um erro acidental (ou comparar ficheiro sem ter de se estar a comparar sempre tudo).
Nesse caso o MD5 é muito seguro. Antes te cai um meteorito azul em cima da cabeça no dia dos teus anos que o MD5 falhar.
No entanto os hashs também são usados para assinar electrónicamente documentos legais ou secretos.
De momento não há nenhum processo conhecido publicamente que consiga falsificar uma assinatura num dado documento, mas já se sabe encontrar um documento no qual se sabe falsificar a assinatura o que é inútil pois é quase certo que esse documento falsificável não nos trás qualquer vantagem, é possível encontrar, mas não criar.
Por isso recomendo também que se abandone o MD5, mas em questões não legais ainda é muito aceitável. Penso que é o mais usado na distribuição de software.
E como o seguro morreu de velho o sha-2 é considerado o mais seguro, para os paranoicos não há nada como o sha-512 (que é um sha-2). Desde este ano que existe uma migração quase universal para o sha2.
Os ainda mais paranoicos usam o sha-1, Pode não ser tão bom mas com o é mais antigo já foi mais testado
Os ainda mais paranoicos sabem que o NSI já quebrou estes algoritmos todos.
(NOTA: não há nenhuma prova matemática que prove que um qualquer hash não possa ser quebrado com algoritmo muito simples ainda não descoberto, e muitos matemáticos pensam que isso é impossível de provar)
José Simões
Concordo com o que foi descrito, mas é importante que se se avise que:
– o MD5 já não é considerado seguro e podem ver em :
“http://en.wikipedia.org/wiki/MD5” – nas Collision vulnerabilities
e em
“http://www.schneier.com/blog/archives/2008/12/forging_ssl_cer.html”
Usem no mínimo SHA1 ou então SHA256.
O MD5 era(ou ainda é) utilizado no Flickr e como podem ver neste pdf é possível “hackar” o sistema porque o mesmo usa essa algoritmo de hash.
“http://netifera.com/research/flickr_api_signature_forgery.pdf”
Excelente artigo.
Só uma dica (para os mais paranóicos) se fizerem o download de uma iso de Linux num “mirror”, comparem sempre com o hash do site “original”.
Utilizem sempre repositórios de confiança, que disponibilizem uma chave pública, numa página web autenticada.
🙂
Um programa muito que uso para verificar hash’s no Windows é o HashTab – http://beeblebrox.org .
Ele cria uma aba/tab nas propriedades de quaisquer arquivos do sistema, onde você pode escolher várias opções de hash para se verificar.
*Um programa muito bom(…)*
Desculpa.
Bom artigo, muito elucidativo.
E alguém sabe dizer como se abre e se queima em CD um programa recebido em tar.md5