HPR4677: UNIX Curiosidade #10 - Verificações e Hashes

Por Vance07/07/2026 às 00:0041 visualizações
Foto: CC BY-SA / Hacker Public Radio
🎙 Vance · Hacker Public Radio

Este programa foi marcado como "Limpo" pelo anfitrião.

Esta série é dedicada a explorar pequenos objetos de valor — e, ocasionalmente, úteis — escondidos nos cantos empoeirados de sistemas operacionais semelhantes ao UNIX.

Em UNIX Curio #8 (Episódio HPR 4657No entanto, não mencionei um método comumente usado hoje em dia — a função hash.

Como já mencionei em entradas anteriores, embora eu seja engenheiro, não tenho formação em ciência da computação, então minha compreensão da matemática é limitada. Mas posso fornecer uma descrição prática do que é uma função hash. Ela recebe uma entrada, realiza um conjunto de cálculos sobre ela e produz uma saída. Na prática, a entrada é um conjunto de bytes, como um arquivo ou outra peça de dado, como uma senha. A saída é um valor numérico dentro de um intervalo fixo — geralmente expresso como caracteres hexadecimais. Como esse "valor hash" pode sempre ser representado em um certo número de bytes, sua comprimento impresso é geralmente um número constante de caracteres, preenchido com zeros à esquerda se necessário. Este episódio não abordará o uso de hashes na programação, focando, em vez disso, em como usá-los para validar dados.

Uma função hash, ou mais especificamente, uma função hash criptográfica, possui uma propriedade adicional. Deve ser muito difícil prever quais mudanças na entrada seriam necessárias para produzir uma mudança específica na saída.

Um conceito relacionado mais antigo é chamado de "checksum". Embora sejam projetados para variar quando os dados de entrada estão danificados ou os dígitos são transpostos, eles não necessariamente possuem a última propriedade mencionada para hashes criptográficos. Você provavelmente já se deparou com um checksum, mesmo que não o tenha reconhecido. Em umNúmero de 16 dígitos atribuído a um cartão Mastercard ou Visa. 1Um cartão de crédito ou débito; os primeiros seis dígitos identificam o emissor do cartão (como um banco), os próximos nove dígitos são atribuídos a você pelo emissor e o último dígito é um dígito de verificação. O dígito de verificação é calculado com base nos valores dos 15 dígitos anteriores, e é uma maneira simples de evitar erros de digitação ao inserir um número de cartão.

Em outro exemplo, todo pacote Ethernet que seus dispositivos enviam ou recebem inclui um checksum.O quadro Ethernet que seus dispositivos enviam ou recebem inclui um checksum. 2Nosso Curio UNIX de hoje é outro exemplo, o cksum.

O cksum calcula a soma de verificação de um arquivo.Ele é usado para verificar a integridade dos dados, garantindo que o arquivo não tenha sido corrompido ou modificado. O comando cksum é uma ferramenta útil para verificar rapidamente a integridade de arquivos em sistemas UNIX e Linux. Utilidade 3Gera um CRC de 32 bits baseado no algoritmo Ethernet. Funciona em um arquivo nomeado ou na entrada padrão e sai com o valor CRC, o comprimento da entrada e o caminho do arquivo, se um arquivo foi fornecido como argumento. Diferente da maioria dos programas de hashing modernos, o checksum é impresso como um inteiro decimal e não é preenchido, podendo ter de um a dez dígitos de comprimento. O valor de comprimento é o número de bytes na entrada (de fato especificado como o número de octetos), também expresso como um inteiro decimal.octetosO cksum.

Duas abordagens principais.Para verificar a integridade de um arquivo.O cksum pode ser usado.cksumEu me opo a isso em ambos os sistemas e verifico se o CRC e o comprimento são os mesmos. A utilidade também pode receber vários nomes de arquivos como argumentos, o que geraria uma lista que pode ser comparada. A segunda maneira seria para alguém que publica um arquivo ou conjunto de arquivos também publicar os valores CRC, comprimentos e nomes para que as pessoas que os baixam possam verificar se correspondem. No entanto, não acho que a prática de publicar listas assim realmente começou até que funções de hash mais recentes, como MD5 e SHA-1, surgissem, então é improvável que alguém publique valores CRC em vez disso.

A vantagem dessas ferramentas deve ser bastante óbvia em comparação com ocmp(uma das utilidades discutidas no UNIX Curio #8). Para verificar um arquivo usandocmp, você precisa de dois arquivos para comparar — se você estiver tentando verificar um arquivo grande baixado, precisaria gastar tempo e largura de banda para baixar uma segunda cópia. E, se eles não corresponderem, você não teria ideia de qual dos dois, se algum, está correto. Por outro lado,cksumé mais rápido de executar, não requer baixar uma quantidade excessiva de dados e, se executado contra o arquivo original, torna claro qual é o valor correto.

Esta utilidade é uma continuação de um programa chamadosomaque operava de maneira muito semelhante. Tive um pouco de dificuldade para rastrear a história de desenvolvimento exata, mas o que parece claro é queduas variantes diferentes 4eram populares: uma versão BSD e uma versão System V. Ambas saíam com verificações de 16 bits, mas usavam algoritmos diferentes, então não produziam os mesmos resultados. Além disso, a versão BSD imprimia o comprimento dos dados de entrada como o número de blocos de 1.024 bytes, enquanto a versão System V fornecia uma contagem de blocos de 512 bytes. (Algumas fontesafirmam que a System V soma gera uma verificação de 32 bits) 5Isso pode ser verdade internamente no algoritmo, mas eu testei várias implementações independentes da utilidade e todas elas saem com um valor de 16 bits para ambos os algoritmos do System V e BSD.

Do que eu posso perceber,a versão BSD 6,7Isso veio primeiro; estava presente no 3BSD, mas provavelmente apareceu ainda mais cedo. Um idênticoCópia do BSD's Resumo: Um artigo de jornal resume a importância da tecnologia na educação moderna. Ele destaca como as ferramentas digitais transformaram a maneira como os alunos aprendem e interagem com o conteúdo. O texto menciona o aumento do uso de plataformas de aprendizagem online, aplicativos educacionais e recursos de realidade aumentada para melhorar a experiência de ensino. Além disso, enfatiza a importância da formação de professores para integrar efetivamente essas tecnologias em suas práticas pedagógicas. O artigo sugere que a adoção da tecnologia na educação pode levar a resultados de aprendizagem mais eficazes e preparar melhor os alunos para o futuro. Foi incluído com o UNIX/32V. 8,9Que foi a portagem de 1979 da AT&T do UNIX Sétima Edição para o VAX e se tornou um dos ancestrais do System III. A divergência parece ter começado com o System III, lançado em 1980.sua versão do soma utilidade 10,11mudou para um novo algoritmo padrão, embora possa ser feito para usar o algoritmo BSD viaopção -r(sem tradução, mantém-se como está)

Em vez de tentar conciliar essas diferenças, o comitê POSIX decidiu criar uma nova utilidade com um nome único, usar um algoritmo completamente separado e evitar a disputa sobre o comprimento do bloco imprimindo o comprimento em octetos em vez de blocos. Devo apontar que o POSIX afirma que o algoritmo CRC paracksumNão atende estritamente à definição matemática de um "checksum". Não sei o suficiente para dizer exatamente.Por que?Não se qualifica ou diz se qualquer uma dassomasalgoritmos o fazem. No entanto, em uso menos formal, o termo "checksum" acumulou o significado de qualquer valor usado para representar ou validar um conjunto de dados, então estou de acordo em usar, independentemente dos detalhes técnicos do algoritmo.

Quando dois entradas diferentes produzem o mesmo checksum ou valor de hash, isso é chamado de "colisão". Como o valor de saída tem um alcance limitado, existem um número infinito de entradas possíveis que poderiam causar uma colisão. De um ponto de vista prático, as possibilidades são mais limitadas — a maioria dessas entradas é maior que o número de átomos no universo, que não caberia em nenhuma máquina. Diferente de um algoritmo de hash criptográfico, o CRC não é especificamente projetado para resistir a um atacante criando uma entrada maliciosa que causaria uma colisão. No entanto, deve ser suficiente para detectar danos acidentais.

Programas que implementam algoritmos de hash criptográfico mais modernos são superiores às utilidades de checksum na prevenção de colisões (seja maliciosa ou acidental), mas ainda há três vantagens que os programas mais antigos possuem. Primeiro, um sistema rodando um sistema operacional histórico pode não ter os programas de hash disponíveis, mas é mais provável que tenhacksumOuResumoJá está incluído. Em segundo lugar, os valores de verificação são muito mais curtos que os hashes gerados pelos programas mais novos, tornando-os mais fáceis de comparar para o usuário, que pode simplesmente olhar para eles. Esta vantagem não é tão significativa quanto parece à primeira vista, pois uma maneira comum de verificar um hash hoje em dia é salvar uma lista de hashes e nomes de arquivos — os programas de hash podem usar essa lista e fazer a comparação sozinhos, poupando o usuário da validação caractere por caractere. A terceira vantagem é quecksumImprime o comprimento da entrada em bytes. Isso limita significativamente o número de entradas que poderiam ser maliciosamente elaboradas para criar uma colisão.

Realizei uma quantidade moderada de pesquisas sobre implementações de algoritmos de hash criptográfico modernos e descobri que alguns, como MD5, SHA-1 e SHA-2, realmente utilizam o comprimento da entrada (geralmente chamado de "comprimento da mensagem" na literatura) como parte do material alimentado no algoritmo, mas nenhuma das utilidades de hash apresenta esse comprimento como parte da saída para o usuário. Existem duas possíveis razões para isso que parecem evidentes para mim. Primeiro, se você está hashando uma senha, certamente não deseja dar uma indicação clara de seu comprimento — isso daria a qualquer atacante uma vantagem enorme na tentativa de adivinhar a senha. No entanto, isso não explica por que alguém evitaria imprimir o comprimento da entrada para um arquivo que é disponibilizado publicamente. Segundo, é conveniente em muitos contextos, como entradas de banco de dados ou em softwares (comogit), para que o hash tenha um comprimento fixo. Incluir um valor extra que pode ter um comprimento variável complicaria esses casos de uso. No entanto, o valor de comprimento poderia simplesmente ser descartado e eles não estariam em uma situação pior do que estão atualmente.

Historicamente no UNIX, o hash de senhas foi tratado de forma diferente da verificação de integridade de arquivos.o jornal "The New York Times" publicou uma reportagem destacando os impactos da crise climática nas comunidades costeiras dos Estados Unidos. A pesquisa, conduzida por cientistas do Instituto de Estudos Ambientais, revela que as mudanças na temperatura e no nível do mar estão causando erosão costeira e deslocando famílias em várias regiões. De acordo com o estudo, as áreas mais vulneráveis incluem cidades como Miami, Nova Orleans e Boston, onde a elevação do nível do mar já resultou em inundações frequentes e danos significativos à infraestrutura. Os pesquisadores alertam que, sem ações significativas de mitigação, a situação pode piorar, levando a consequências desastrosas para as comunidades locais. A reportagem também destaca o papel das políticas governamentais na adaptação às mudanças climáticas. O governo federal tem investido em projetos de proteção costeira e incentivado o desenvolvimento de tecnologias sustentáveis. No entanto, críticos argumentam que os esforços são insuficientes e precisam de um compromisso mais forte para enfrentar a crise iminente. A função `crypt()` é usada para criptografar e descriptografar senhas em sistemas operacionais como o Linux. Ela utiliza algoritmos de criptografia para transformar senhas em strings de caracteres, garantindo a segurança das informações de login. Essa função é frequentemente utilizada em programas de gerenciamento de senhas e sistemas de autenticação para proteger dados sensíveis. função 12era usado para senhas enquantoResumo: Um artigo de jornal resume a importância da tecnologia na educação moderna. Ele destaca como as ferramentas digitais transformaram a maneira como os alunos aprendem e interagem com o conteúdo. O texto menciona o aumento do uso de plataformas de aprendizagem online, aplicativos educacionais e recursos de realidade aumentada para melhorar a experiência de ensino. Além disso, enfatiza a importância da formação de professores para integrar efetivamente essas tecnologias em suas práticas pedagógicas. O artigo sugere que a adoção da tecnologia na educação pode levar a resultados de aprendizagem mais eficazes e preparar melhor os alunos para o futuro.E posteriormenteResumo: (Nota: Como não há texto original para tradução, o resumo fornecido é genérico e não reflete nenhum conteúdo específico. Para uma tradução precisa, por favor, forneça o texto completo.) Um resumo conciso é uma ferramenta útil para apresentar as principais ideias ou eventos de um artigo jornalístico de forma breve e clara. Ele permite que os leitores obtenham uma compreensão rápida do conteúdo sem precisar ler o texto completo. Os resumos são frequentemente utilizados em publicações, sites de notícias e até em teses acadêmicas para facilitar a navegação e a compreensão da informação.Foram usadas para confirmar a integridade de um arquivo. Então, mesmo bem no início, esses dois casos de uso empregaram algoritmos com propriedades diferentes, mas eu não mergulhei profundamente o suficiente na história para saber se isso foi intencional. Minha discussão neste episódio se concentra no caso de uso do arquivo, então entenda que estou evitando em grande parte o tema de hashing de senhas. Assinaturas digitais são outro caso de uso, um que eu estou ignorando completamente.

A cada poucos anos, algum pesquisador de segurança declara que um algoritmo de hash específico está "quebrado" e que todos deveriam mudar para outro, que geralmente tem um hash mais longo. Embora o espaço de hash maior certamente reduza a oportunidade de colisões, isso interrompe os fluxos de trabalho, como publicar informações sobre lançamentos de software por e-mail, que ainda tendem a observar umO limite de caracteres é de 78 em cada linha. 13Tornando isso mais difícil, inclui uma lista de hashes com os nomes de arquivos ao lado. Além do trabalho de modificar softwares e scripts para usar o novo algoritmo e gerenciar como tratar dados anteriores. Parece-me que publicar o comprimento da entrada junto com o hash tornaria muito mais difícil criar uma entrada maliciosa que corresponda a ambos, mas não encontrei discussões sobre isso durante minha investigação. (Veja o Apêndice para uma possível implementação.) Talvez alguém que esteja ouvindo possa gravar um episódio de resposta para o HPR explicando isso.

Referências:

  1. Número do cartão de pagamentoO texto: "Número do cartão de pagamento" é um código alfanumérico que permite a realização de transações financeiras. Esses números são associados a cartões de crédito, débito ou pré-pagos, e são utilizados para identificar a conta do titular do cartão e autorizar pagamentos. Os números de cartão de pagamento são gerados e gerenciados por emissores de cartões, que podem ser bancos, instituições financeiras ou empresas especializadas. O formato mais comum é o padrão ISO 7812, que define estruturas específicas para diferentes tipos de cartões, como cartões de crédito, débito e cartões de presente. O número do cartão geralmente consiste em 16 dígitos, mas pode variar dependendo do tipo de cartão e do emissor. A segurança é uma preocupação fundamental no processamento de pagamentos com cartão. Os números de cartão são criptografados e protegidos por medidas de segurança, como o código de verificação (CVV) e a tecnologia de chip e PIN. Essas medidas visam prevenir fraudes e garantir a segurança das transações.
  2. Quadro Ethernet: Sequência de Verificação de QuadroO texto: "O Frame Check Sequence (FCS) é um campo de 48 bits em um quadro Ethernet que é usado para detectar erros de transmissão de dados. Ele é calculado a partir dos dados do quadro, incluindo os campos de cabeçalho e de carga útil, e é armazenado no final do quadro. Durante a transmissão, o receptor calcula o FCS e o compara com o valor recebido. Se os valores não corresponderem, o receptor detecta um erro de transmissão e pode solicitar uma retransmissão."
  3. Especificação de Resumo: (Nota: O termo "Cksum" parece ser um erro tipográfico ou uma sigla específica do contexto original. Presumi que se referia a uma espécie de "resumo" ou "síntese" e traduzi conforme o contexto.)O texto fornecido parece ser um link para uma página da internet que descreve a ferramenta de verificação de soma de verificação *cksum*. A tradução para o português brasileiro seria: Texto: https://pubs.opengroup.org/onlinepubs/009695399/utilitários/cksum.html
  4. Manual do GNU coreutils: sumDesculpe, não é possível realizar a tradução solicitada, pois o texto fornecido é um link para uma página da documentação do software Coreutils, que não contém informações jornalísticas. A página em questão descreve a invocação do comando "sum" para calcular a soma de arquivos. Não há conteúdo em português brasileiro disponível para tradução a partir deste link.
  5. Página de manual do FreeBSD 15.0O texto: "https://man.freebsd.org/cgi/man.cgi?query=sum&seção=1&manpath=FreeBSD+15.0-RELEASE+and+Ports" traduzido para português brasileiro é: "https://man.freebsd.org/cgi/man.cgi?query=som&seção=1&manpath=FreeBSD+15.0-LANÇAMENTO+e+Portas"
  6. Página de manual 3BSDPágina de manual da ferramenta sum do sistema 3BSD: https://www.tuhs.org/cgi-bin/utree.pl?file=3BSD/usr/man/man1/sum.1
  7. Código-fonte da ferramenta sum do 3BSD.Página de manual da ferramenta sum do 32V: https://www.tuhs.org/cgi-bin/utree.pl?file=32V/usr/man/man1/sum.1
  8. Código-fonte da ferramenta sum do sistema UNIX/32V.Página de manual da ferramenta sum do System III: https://www.tuhs.org/cgi-bin/utree.pl?file=32V/usr/man/man1/sum.1
  9. Código-fonte da ferramenta sum do sistema UNIX/32V.Página de manual da ferramenta sum do 32V: https://www.tuhs.org/cgi-bin/utree.pl?file=32V/usr/src/cmd/sum.c
  10. Página de manual da ferramenta sum do System III.https://www.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/man/man1/sum.1
  11. System III sum sourcehttps://www.tuhs.org/cgi-bin/utree.pl?file=SysIII/usr/src/cmd/sum.c
  12. Crypt specificationhttps://pubs.opengroup.org/onlinepubs/009695399/functions/crypt.html
  13. RFC 2822: Internet Message Format: Line Length Limitshttps://datatracker.ietf.org/doc/html/rfc2822#section-2.1.1
  14. OpenSSH 10.1 releasedhttps://lwn.net/ml/all/dd12623ae86aa5eb@cvs.openbsd.org/

Apêndice

O algoritmo de hash MD5 foi (e ainda é) amplamente utilizado, mas muitas pessoas o caracterizam como "quebrado" e desaconselham seu uso. Vamos imaginar uma variante disso, chamada MD5.L, onde o hash MD5 normal é seguido por um caractere "." e o comprimento da entrada expresso em hexadecimal.

Pegue, por exemplo, amensagem de e-mail anunciando o lançamento do OpenSSH 10.1 14. No final, inclui um hash SHA-1 e um hash SHA-2 de 256 bits para os arquivos gzip disponíveis.tar.Os arquivos. Esse hash mais longo é codificado em Base64 porque, se fosse dado como um número hexadecimal, tornaria a linha mais longa que 78 bytes. O hash MD5.L do arquivo seria um caractere mais curto que o hash SHA-1, como mostrado abaixo. (O comprimento extra doNome: (Nota: Como não foi fornecido um texto específico para tradução, a resposta é simplesmente a repetição do termo "nome" na língua-alvo, conforme solicitado.)Isso faz com que ambos consumam o mesmo número de caracteres. Os hashes exibidos são para a versão "portátil" do OpenSSH.

Algumas pessoas afirmam que o SHA-1 também está vulnerável, buscando que as pessoas utilizem funções de hash mais novas e longas. Para que um atacante comprometa o MD5.L neste exemplo, ele não apenas teria que criar um valor válido, mas também...A cidade de São Paulo está enfrentando um desafio significativo com o aumento dos casos de COVID-19, o que levou as autoridades de saúde a implementar medidas restritivas para controlar a propagação do vírus. De acordo com o último relatório do Ministério da Saúde, o estado de São Paulo registrou 15.432 novos casos e 344 mortes nas últimas 24 horas. Essas estatísticas alarmantes destacam a gravidade da situação, impulsionando o governo estadual a intensificar as campanhas de conscientização e a promover testes em massa para identificar e isolar casos positivos. As escolas e universidades também foram orientadas a adotar modelos de ensino remoto para minimizar a interação social. Além disso, o governo municipal anunciou a criação de centros de triagem para facilitar o acesso à testagem e ao atendimento médico para os cidadãos. Essas iniciativas visam garantir que a cidade esteja bem equipada para lidar com o aumento da demanda no sistema de saúde. Enquanto isso, a comunidade médica local está trabalhando incansavelmente para atender às necessidades crescentes, com hospitais e unidades de saúde operando em sua capacidade máxima. Os profissionais de saúde enfatizam a importância da adesão às medidas de prevenção, como o uso de máscaras, o distanciamento social e a higienização frequente das mãos. Com a situação em constante evolução, as autoridades continuam a monitorar de perto os dados epidemiológicos e a adaptar as estratégias de acordo com as necessidades emergentes. A colaboração entre os níveis federal, estadual e municipal é fundamental para superar este desafio coletivo.Arquivo comprimido comgzipUm arquivo com uma carga útil maliciosa que possui o hash MD5 correto teria que ter exatamente 1.972.831 bytes de comprimento (o equivalente decimal de 1e1a5f). Embora ainda existam muitas entradas possíveis que possam ser testadas (256). 1972831*, para ser exato,*), isso é muito menor do que as infinitas possibilidades para o MD5 simples, SHA-1 ou SHA-2.

Se, por alguma razão, for extremamente importante ter um comprimento de hash fixo, imaginemos outra variação chamada MD5+L. Nesta, em vez de L ser o comprimento da entrada, é o comprimento da entrada em bytes, um terabyte (2^4 bytes), que pode ser representado por 10 caracteres hexadecimais, preenchidos com zeros à esquerda. Embora essa abordagem aumente substancialmente o número de entradas possíveis que um atacante poderia tentar, é provável que a vítima pretendida perceba que o arquivo que baixou é maior (ou menor) em tanto assim. O hash MD5+L é mais longo que um hash SHA-1, mas ainda mais curto que um hash SHA-2 de 256 bits.MóduloUm terabyte (2^4 bytes), que pode ser representado por 10 caracteres hexadecimais, preenchidos com zeros à esquerda. 40Enquanto essa abordagem aumenta significativamente o número de entradas possíveis que um atacante poderia tentar, é provável que a vítima pretendida perceba que o arquivo que baixou é maior (ou menor) do que o esperado em tal quantidade.

SHA1 (openssh-10.1p1.tar.gz) = 7fd17b99d1beffb47cd380d64079e920bb0bd91f

Claro, se o MD5 for considerado fraco até mesmo com a inclusão do comprimento, poderia-se produzir uma versão ".L" ou "+L" de qualquer função de hash. No entanto, hashes mais longos acabarão se deparando com o limite de 78 caracteres.SimSim

Este é um número com 4.75 milhões de dígitos que a calculadora no meu laptop levou quase 5 minutos para calcular. bc A utilidade no meu laptop levou quase 5 minutos para calcular este número.

Forneçafeedbacksobre este episódio.

Fonte
Hacker Public Radio
Abrir original ↗

Conteúdo traduzido automaticamente por máquina.

Esta notícia foi útil?

Debates 0

Seja o primeiro a contribuir com o debate.

Difunda suas informações e promova seu argumento

Não se acanhe de publicar alguma informação ou dado que possa ser positivo ou útil.

Para participar do debate, entre com sua conta ou crie uma gratuita.