{"id":14,"date":"2026-06-10T09:14:33","date_gmt":"2026-06-10T09:14:33","guid":{"rendered":"https:\/\/shattered.io\/pt\/2026\/06\/10\/colisao-sha1\/"},"modified":"2026-06-10T13:35:45","modified_gmt":"2026-06-10T13:35:45","slug":"colisao-sha1","status":"publish","type":"post","link":"https:\/\/shattered.io\/pt\/2026\/06\/10\/colisao-sha1\/","title":{"rendered":"A Colis\u00e3o SHAttered do SHA-1, Explicada"},"content":{"rendered":"<p>A 23 de fevereiro de 2017, investigadores do Cryptology Group do CWI Amesterd\u00e3o e da Google publicaram dois ficheiros PDF diferentes que partilham o mesmo hash SHA-1. Para ambos, o resumo \u00e9 <code>38762cf7f55934b34d179ae6a4c80cadccbb7f0a<\/code>. O projeto chamou-se SHAttered e foi a primeira vez que algu\u00e9m produziu uma colis\u00e3o pr\u00e1tica e p\u00fablica para a fun\u00e7\u00e3o de hash SHA-1 completa. Pode descarregar os dois ficheiros e confirmar por si: <a href=\"https:\/\/shattered.io\/static\/shattered-1.pdf\">shattered-1.pdf<\/a> e <a href=\"https:\/\/shattered.io\/static\/shattered-2.pdf\">shattered-2.pdf<\/a>. S\u00e3o documentos visivelmente distintos e, ainda assim, o SHA-1 n\u00e3o consegue distingui-los.<\/p>\n<p>Aquele facto \u00fanico p\u00f4s fim a uma longa discuss\u00e3o sobre se ainda era seguro confiar no SHA-1. Este artigo percorre o que \u00e9 uma colis\u00e3o, por que motivo o SHA-1 caiu, o que a equipa construiu de facto e o que mudou a seguir.<\/p>\n<h2 id=\"o-que-e-uma-colisao-de-hash-e-por-que-importa\">O que \u00e9 uma colis\u00e3o de hash e por que importa<\/h2>\n<p>Uma <a href=\"\/pt\/cryptography\/funcoes-hash\/\">fun\u00e7\u00e3o de hash<\/a> criptogr\u00e1fica recebe uma entrada de qualquer tamanho e devolve uma impress\u00e3o digital de comprimento fixo. O SHA-1 produz 160 bits, habitualmente escritos como 40 caracteres hexadecimais. Esperam-se tr\u00eas propriedades: n\u00e3o se consegue inverter a sa\u00edda de volta \u00e0 entrada, n\u00e3o se consegue encontrar uma segunda entrada que produza um dado resumo, e n\u00e3o se conseguem encontrar duas entradas quaisquer com o mesmo valor. Esta \u00faltima propriedade \u00e9 a resist\u00eancia a colis\u00f5es.<\/p>\n<p>As colis\u00f5es existem sempre, num sentido matem\u00e1tico. H\u00e1 uma infinidade de entradas poss\u00edveis e apenas um n\u00famero finito de sa\u00eddas de 160 bits, por isso algumas entradas t\u00eam for\u00e7osamente de partilhar resumo. A promessa de seguran\u00e7a n\u00e3o \u00e9 que as colis\u00f5es n\u00e3o existam. \u00c9 que encontrar uma deve ser t\u00e3o caro que nenhum atacante realista o consiga fazer. O SHAttered quebrou essa promessa para o SHA-1.<\/p>\n<p>Por que importa isto fora de um laborat\u00f3rio? As assinaturas digitais, os certificados e as verifica\u00e7\u00f5es de integridade raramente assinam o documento em si. Assinam o seu hash. Uma assinatura, um identificador de commit no Git, a impress\u00e3o digital de um certificado, a garantia de que um ficheiro n\u00e3o mudou: tudo reduz o ficheiro a um hash e confia que esse hash \u00e9 \u00fanico daquele ficheiro. Se dois ficheiros partilharem um hash, uma assinatura sobre um \u00e9 igualmente v\u00e1lida sobre o outro. A liga\u00e7\u00e3o entre o que foi aprovado e o que foi recebido quebra-se em sil\u00eancio.<\/p>\n<h2 id=\"por-que-o-sha-1-era-vulneravel\">Por que o SHA-1 era vulner\u00e1vel<\/h2>\n<p>O SHA-1 foi publicado pela NSA e normalizado pelo NIST em 1995. Assenta na constru\u00e7\u00e3o de Merkle-Damgard, processando a mensagem em blocos e misturando cada bloco num estado interno atrav\u00e9s de uma sequ\u00eancia de adi\u00e7\u00f5es, rota\u00e7\u00f5es e opera\u00e7\u00f5es ao n\u00edvel dos bits.<\/p>\n<p>Os problemas come\u00e7aram cedo. Em 2005, um grupo de investigadores liderado por Wang mostrou que era poss\u00edvel encontrar colis\u00f5es com um esfor\u00e7o bastante abaixo do que um ataque gen\u00e9rico do anivers\u00e1rio exigiria sobre um hash de 160 bits. Era um resultado te\u00f3rico, muito al\u00e9m do equipamento da \u00e9poca, mas marcou o SHA-1 como enfraquecido. Ao longo da d\u00e9cada seguinte, criptanalistas, entre eles Marc Stevens, refinaram ataques diferenciais que exploram a forma como pequenas diferen\u00e7as, cuidadosamente escolhidas, se propagam pela fun\u00e7\u00e3o de ronda, estreitando a dist\u00e2ncia entre a teoria e um ataque constru\u00edvel.<\/p>\n<p>A fraqueza central \u00e9 estrutural. A fun\u00e7\u00e3o de ronda do SHA-1 n\u00e3o difunde as diferen\u00e7as com for\u00e7a suficiente para impedir que um atacante construa dois blocos de mensagem cujas perturba\u00e7\u00f5es internas se cancelem no final. Uma vez conseguido esse cancelamento, \u00e9 poss\u00edvel for\u00e7ar o estado interno a convergir, e a colis\u00e3o segue-se.<\/p>\n<h2 id=\"o-que-a-equipa-do-shattered-fez-de-facto\">O que a equipa do SHAttered fez de facto<\/h2>\n<p>O ataque foi uma colis\u00e3o de prefixo id\u00eantico. Os dois PDF come\u00e7am exatamente com os mesmos bytes. Os investigadores calcularam depois um par de sequ\u00eancias de blocos de quase-colis\u00e3o, cuidadosamente constru\u00eddas, que, anexadas a esse prefixo partilhado, conduzem o estado interno do SHA-1 ao mesmo valor. Como os estados internos coincidem no ponto em que terminam os blocos da colis\u00e3o, tudo o que se anexe a seguir mant\u00e9m os hashes iguais, consequ\u00eancia direta do desenho de Merkle-Damgard.<\/p>\n<p>O formato PDF foi uma escolha deliberada. \u00c9 flex\u00edvel o suficiente para esconder os blocos da colis\u00e3o dentro de um objeto que controla qual a imagem mostrada, de modo que o mesmo hash corresponde a dois documentos que apresentam conte\u00fado vis\u00edvel diferente. \u00c9 isto que transforma um par abstrato de cadeias de bytes num cen\u00e1rio de abuso cred\u00edvel.<\/p>\n<p>A equipa por detr\u00e1s do trabalho incluiu investigadores do CWI Amesterd\u00e3o e da Google, entre eles Marc Stevens, Pierre Karpman, Elie Bursztein, Ange Albertini e Yarik Markov. O documento completo, com a matem\u00e1tica e o detalhe de engenharia, est\u00e1 dispon\u00edvel aqui em <a href=\"https:\/\/shattered.io\/static\/shattered.pdf\">shattered.pdf<\/a>.<\/p>\n<h2 id=\"a-escala-do-calculo\">A escala do c\u00e1lculo<\/h2>\n<p>O SHAttered n\u00e3o foi um atalho esperto que corre num port\u00e1til. Foi um c\u00e1lculo genuinamente grande, e os n\u00fameros s\u00e3o o ponto central.<\/p>\n<table>\n<thead>\n<tr>\n<th>Abordagem<\/th>\n<th>Avalia\u00e7\u00f5es de SHA-1<\/th>\n<th>Notas<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Ataque gen\u00e9rico do anivers\u00e1rio<\/td>\n<td>cerca de 2^80<\/td>\n<td>Refer\u00eancia de for\u00e7a bruta para um hash de 160 bits<\/td>\n<\/tr>\n<tr>\n<td>Ataque SHAttered de prefixo id\u00eantico<\/td>\n<td>cerca de 2^63 (aproximadamente 9,2 quintili\u00f5es)<\/td>\n<td>O trabalho realmente demonstrado<\/td>\n<\/tr>\n<tr>\n<td>Ganho face \u00e0 for\u00e7a bruta<\/td>\n<td>cerca de 100 000 vezes<\/td>\n<td>A raz\u00e3o pela qual o ataque foi sequer vi\u00e1vel<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>A Google descreveu o esfor\u00e7o como o equivalente a cerca de 6500 anos-CPU na primeira fase e 110 anos-GPU na segunda. Distribu\u00eddo por uma grande frota de m\u00e1quinas, isso s\u00e3o meses de trabalho, n\u00e3o s\u00e9culos. A estrutura em fases \u00e9 relevante: uma pesquisa dispendiosa produz primeiro uma configura\u00e7\u00e3o utiliz\u00e1vel de quase-colis\u00e3o, e depois uma segunda etapa, mais barata, fecha o par correspondente. As cerca de 9,2 quintili\u00f5es de avalia\u00e7\u00f5es de hash soam astron\u00f3micas, e s\u00e3o, mas ficam muito abaixo do muro da for\u00e7a bruta. Essa diferen\u00e7a \u00e9 exatamente o que a criptan\u00e1lise existe para encontrar.<\/p>\n<h2 id=\"por-que-dois-pdf-com-o-mesmo-hash-sao-perigosos\">Por que dois PDF com o mesmo hash s\u00e3o perigosos<\/h2>\n<p>Imagine um fluxo de assinatura. Um revisor aprova um contrato e um sistema assina o hash SHA-1 desse PDF. Com um par de colis\u00e3o em m\u00e3os, um atacante pode preparar de antem\u00e3o dois contratos que partilham um hash: um inofensivo, para ser aprovado, e um malicioso, para ser substitu\u00eddo mais tarde. A assinatura feita sobre o ficheiro aprovado valida na perfei\u00e7\u00e3o contra o ficheiro trocado, porque a assinatura s\u00f3 cobriu o hash, e o hash \u00e9 id\u00eantico.<\/p>\n<p>A mesma l\u00f3gica amea\u00e7a qualquer sistema que use o SHA-1 como identidade:<\/p>\n<ul>\n<li><strong>Certificados.<\/strong> Uma autoridade de certifica\u00e7\u00e3o que assine um certificado SHA-1 poderia ser levada a atestar um certificado em colis\u00e3o que nunca pretendeu emitir.<\/li>\n<li><strong>Distribui\u00e7\u00e3o de software.<\/strong> Uma soma de verifica\u00e7\u00e3o SHA-1 que pretende provar a autenticidade de um descarregamento nada prova se existir uma carga em colis\u00e3o.<\/li>\n<li><strong>Controlo de vers\u00f5es.<\/strong> O Git identifica cada commit e cada objeto por um hash SHA-1. Uma colis\u00e3o significa que duas \u00e1rvores ou blobs diferentes podem reivindicar o mesmo identificador, o que p\u00f5e em causa a integridade do reposit\u00f3rio. A depend\u00eancia do Git em rela\u00e7\u00e3o ao SHA-1 foi imediatamente escrutinada ap\u00f3s o an\u00fancio.<\/li>\n<\/ul>\n<p>O ataque n\u00e3o permite forjar um hash para um ficheiro arbitr\u00e1rio que j\u00e1 se tenha em m\u00e3os. Permite que um atacante que controla ambos os documentos produza um par correspondente desde o in\u00edcio. Em contextos de assinatura, cust\u00f3dia, notariza\u00e7\u00e3o e cadeia de fornecimento, controlar ambos os documentos \u00e9 uma situa\u00e7\u00e3o perfeitamente comum, e foi isso que tornou o resultado t\u00e3o inc\u00f3modo.<\/p>\n<h2 id=\"consequencias-reais-e-a-passagem-para-o-sha-256\">Consequ\u00eancias reais e a passagem para o SHA-256<\/h2>\n<p>A aposenta\u00e7\u00e3o do SHA-1 estava prevista no papel havia anos, mas o SHAttered transformou uma recomenda\u00e7\u00e3o numa emerg\u00eancia. Um artefacto reproduz\u00edvel \u00e9 muito mais persuasivo do que uma estimativa de complexidade.<\/p>\n<p>A resposta foi r\u00e1pida e ampla. Os fabricantes de navegadores conclu\u00edram a remo\u00e7\u00e3o da confian\u00e7a nos certificados TLS com SHA-1, e as autoridades de certifica\u00e7\u00e3o completaram a migra\u00e7\u00e3o para o SHA-256. Em poucos dias, o Git adicionou um detetor de colis\u00f5es embutido, baseado na biblioteca <code>sha1collisiondetection<\/code>, que sinaliza entradas com as marcas desta classe de ataque, e o projeto iniciou um esfor\u00e7o mais longo rumo a um formato de objeto refor\u00e7ado. Protocolos, gestores de pacotes e ferramentas de assinatura aceleraram as suas pr\u00f3prias retiradas do SHA-1.<\/p>\n<p>O destino da maior parte dessa migra\u00e7\u00e3o foi o <a href=\"\/pt\/cryptography\/sha-256\/\">SHA-256<\/a>, parte da fam\u00edlia SHA-2. O SHA-256 n\u00e3o tem qualquer ataque de colis\u00e3o pr\u00e1tico conhecido, disp\u00f5e de uma sa\u00edda mais larga, de 256 bits, e de um desenho interno mais forte, raz\u00f5es pelas quais se tornou o padr\u00e3o para certificados, assinaturas e verifica\u00e7\u00f5es de integridade. Para uma vis\u00e3o de como estas pe\u00e7as encaixam, veja o <a href=\"\/pt\/cryptography\/\">artigo central de criptografia<\/a>.<\/p>\n<h2 id=\"o-que-o-shattered-significa-hoje\">O que o SHAttered significa hoje<\/h2>\n<p>O SHA-1 n\u00e3o deve ser usado onde a resist\u00eancia a colis\u00f5es importa. Isso inclui assinaturas, certificados e qualquer verifica\u00e7\u00e3o do g\u00e9nero &#8220;isto foi adulterado?&#8221; sobre dados que um advers\u00e1rio possa influenciar. Para esses usos, o SHA-256 ou algo mais forte \u00e9 o m\u00ednimo.<\/p>\n<p>H\u00e1 nuances que vale a pena manter claras. A resist\u00eancia \u00e0 pr\u00e9-imagem do SHA-1, ou seja, a dificuldade de inverter um hash ou de coincidir com um hash que n\u00e3o se ajudou a criar, n\u00e3o foi quebrada. Por isso, um uso sem fim de seguran\u00e7a, como uma chave de desduplica\u00e7\u00e3o sobre dados de confian\u00e7a, tem um perfil de risco diferente de uma assinatura. A orienta\u00e7\u00e3o honesta continua simples: se a seguran\u00e7a depende do hash, abandone o SHA-1.<\/p>\n<p>A li\u00e7\u00e3o mais ampla sobreviveu \u00e0 quebra concreta. As primitivas criptogr\u00e1ficas envelhecem. Um ataque que parece puramente te\u00f3rico, como o resultado de 2005, tende a aproximar-se da pr\u00e1tica \u00e0 medida que a an\u00e1lise se afina e o equipamento fica mais barato. O SHAttered \u00e9 a ilustra\u00e7\u00e3o mais limpa desse arco: doze anos entre estar enfraquecido no papel e existirem dois ficheiros reais, com um \u00fanico hash, descarreg\u00e1veis hoje.<\/p>\n<p>Se quiser ver a quebra com os pr\u00f3prios olhos, obtenha <a href=\"https:\/\/shattered.io\/static\/shattered-1.pdf\">shattered-1.pdf<\/a> e <a href=\"https:\/\/shattered.io\/static\/shattered-2.pdf\">shattered-2.pdf<\/a>, calcule o <code>sha1sum<\/code> de cada um e observe dois documentos diferentes a devolver o mesmo resumo de 40 caracteres.<\/p>\n<h2 id=\"perguntas-frequentes\">Perguntas frequentes<\/h2>\n<h3 id=\"o-shattered-quebrou-o-sha-1-por-completo\">O SHAttered quebrou o SHA-1 por completo?<\/h3>\n<p>A sua resist\u00eancia a colis\u00f5es foi quebrada na pr\u00e1tica, que \u00e9 a propriedade que protege assinaturas e certificados. O ataque produz um par de ficheiros com um hash coincidente. N\u00e3o inverte hashes nem permite a um atacante coincidir com um ficheiro em cuja cria\u00e7\u00e3o n\u00e3o participou, pelo que a resist\u00eancia \u00e0 pr\u00e9-imagem do SHA-1 permanece intacta. Para qualquer coisa sens\u00edvel \u00e0 seguran\u00e7a, essa distin\u00e7\u00e3o n\u00e3o o salva: passe para o SHA-256.<\/p>\n<h3 id=\"alguem-pode-usar-isto-para-forjar-um-hash-de-um-ficheiro-que-eu-ja-tenho\">Algu\u00e9m pode usar isto para forjar um hash de um ficheiro que eu j\u00e1 tenho?<\/h3>\n<p>N\u00e3o. O SHAttered \u00e9 uma colis\u00e3o de prefixo id\u00eantico, o que significa que o atacante constr\u00f3i ambos os documentos em conjunto para que partilhem um hash. N\u00e3o consegue pegar num ficheiro existente que voc\u00ea controla e fabricar um segundo ficheiro que lhe corresponda. O perigo vive em fluxos onde \u00e9 o atacante a fornecer os documentos, como assinatura, notariza\u00e7\u00e3o ou cust\u00f3dia.<\/p>\n<h3 id=\"por-que-os-investigadores-usaram-ficheiros-pdf\">Por que os investigadores usaram ficheiros PDF?<\/h3>\n<p>O PDF \u00e9 flex\u00edvel o suficiente para embutir os blocos da colis\u00e3o dentro de um objeto que seleciona qual o conte\u00fado apresentado, de modo que um \u00fanico hash pode corresponder a dois documentos com aspeto diferente no ecr\u00e3. Isso torna a amea\u00e7a concreta: modela um ficheiro inofensivo a ser aprovado e um malicioso a ser trocado sob a mesma assinatura. O par est\u00e1 em <a href=\"https:\/\/shattered.io\/static\/shattered-1.pdf\">shattered-1.pdf<\/a> e <a href=\"https:\/\/shattered.io\/static\/shattered-2.pdf\">shattered-2.pdf<\/a>.<\/p>\n<h3 id=\"o-sha-256-e-afetado-pelo-mesmo-ataque\">O SHA-256 \u00e9 afetado pelo mesmo ataque?<\/h3>\n<p>N\u00e3o. O SHAttered explora fraquezas espec\u00edficas da fun\u00e7\u00e3o de ronda do SHA-1 e da sua sa\u00edda de 160 bits. O <a href=\"\/pt\/cryptography\/sha-256\/\">SHA-256<\/a> usa um desenho diferente, com um resumo de 256 bits, e n\u00e3o tem qualquer ataque de colis\u00e3o pr\u00e1tico conhecido, raz\u00e3o pela qual se tornou o substituto padr\u00e3o em navegadores, autoridades de certifica\u00e7\u00e3o e controlo de vers\u00f5es.<\/p>\n<div class=\"shat-sources\">\n<h2 id=\"fontes\">Fontes<\/h2>\n<ul>\n<li><a href=\"https:\/\/eprint.iacr.org\/2017\/190\" rel=\"noopener\" target=\"_blank\">Stevens et al., The first collision for full SHA-1 (IACR ePrint 2017\/190)<\/a><\/li>\n<li><a href=\"https:\/\/security.googleblog.com\/2017\/02\/announcing-first-sha1-collision.html\" rel=\"noopener\" target=\"_blank\">Google Security Blog: Announcing the first SHA-1 collision<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"shat-related\">\n<h2 id=\"artigos-relacionados\">Artigos relacionados<\/h2>\n<ul>\n<li><a href=\"https:\/\/shattered.io\/pt\/cryptography\/funcoes-hash\/\">Fun\u00e7\u00f5es de Hash Criptogr\u00e1ficas Explicadas<\/a><\/li>\n<li><a href=\"https:\/\/shattered.io\/pt\/cryptography\/\">Hashing e Criptografia Explicados<\/a><\/li>\n<li><a href=\"https:\/\/shattered.io\/pt\/cryptography\/assinaturas-digitais\/\">Como Funcionam as Assinaturas Digitais<\/a><\/li>\n<li><a href=\"https:\/\/shattered.io\/pt\/cryptography\/sha-256\/\">SHA-256 Explicado: o Padr\u00e3o Atual de Hashing<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>A 23 de fevereiro de 2017, investigadores do Cryptology Group do CWI Amesterd\u00e3o e da Google publicaram dois ficheiros PDF diferentes que partilham o mesmo hash SHA-1. Para ambos, o\u2026<\/p>\n","protected":false},"author":2,"featured_media":21,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-14","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cryptography"],"_links":{"self":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":2,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts\/14\/revisions"}],"predecessor-version":[{"id":45,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/posts\/14\/revisions\/45"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/media\/21"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/media?parent=14"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/categories?post=14"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/pt\/wp-json\/wp\/v2\/tags?post=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}