Checksum: Matemática, downloads, games e segurança
Matemática, downloads, games e segurança são algumas palavras não muito relacionadas no meio comum, mas elas estão intrinsecamente ligadas. Todo mundo que utiliza a internet já deve ter ouvido falar em "arquivos corrompidos" pelo menos uma vez na vida. Os usuários da plataforma de games Steam já podem ter se deparado com a opção "Verificar Integridade dos Arquivos" na aba "Arquivos Locais" das propriedades de algum de seus jogos. Mas, na prática, o que se quer dizer com integridade de arquivos e como todas essas palavras se relacionam?
Primeiro, precisamos entender como os arquivos digitais são representados. Quase todas as pessoas já devem ter visto falar que os computadores só entendem 0 e 1 e isso é meio verdade. Fato é que, nas suas camadas mais profundas, sim ele só entende zero e um. Quando tratamos de um arquivo, podemos representá-lo por meio de zeros e uns, isto é, na base binária. Cada um desses dígitos (0 ou 1) é chamado de bit. Dessa forma é claramente perceptível que alterando um desses bits, em muitos dos casos, o arquivo se torna inutilizável.
O que acontece é que a internet funciona, de modo grosseiro, como um monte de switches e roteadores e a transmissão das informações pela rede pode, de modo simplificado, gerar ruído, isto é, alterar alguns dos bits no arquivo. Quando isso acontece, dizemos que o arquivo foi corrompido.
Agora, exemplificando, imagine você baixar um jogo ou software que apresente alguns arquivos vitais corrompidos. Como saber o porquê seu jogo ou software não funciona? Daí a importância da função para "Verificar a integridade dos arquivos" na plataforma Steam.
Checksum
Para entender como funciona essa verificação de integridades de arquivos precisamos falar de checksum, que traduzindo ao português seria soma de verificação. Um checksum é um número gerado a partir de uma sequência de bits dados. Geralmente esses números são representados como textos contendo dígitos hexadecimais (base 16):
9e107d9d372bb6826bd81d3542a419d6
Observe que a representação da base 16 é feita com as sequências de dígitos 10=A, 11=B, 12=C, 13=D, 14=E, 15=F complementando os 10 dígitos da nossa base decimal. Os algoritmos mais conhecidos para gerar checksum são o MD5 (Message Digest Algorithm 5) e os algoritmos da família SHA (Secure Hash Algorithm) e o interessante é que eles conseguem gerar uma "hash" (passaremos a utilizar apenas o termo hash daqui pra frente, no lugar de checksum) de mesmo tamanho independentemente do tamanho dos dados de entrada, ou seja, a hash para um arquivo de 1mb será do mesmo tamanho que a hash para um arquivo de 2gb.
É importante falar também, que esses algoritmos são de "direção única", o que quer dizer que uma vez gerada uma "hash" não é possível, a partir dessa hash, reverter os dados originais. Elas também são únicas para cada conjunto de dados de entrada. Essa última informação é que nos interessa pois, ela diz que caso se tenha duas hashs iguais, os arquivos serão iguais, mas se os arquivos forem diferentes, suas hashs serão diferentes.
As hashs ou checksums são gerados por meio de operações matemáticas, as quais não descreveremos aqui. Você pode olhar uma implementação, em Python, de um desses algoritmos (MD5) em [4] ou olhar o pseudocódigo em [5].
Downloads e Games
É perceptível a importância desses algoritmos para se verificar se dois arquivos iguais sem precisar comparar bit por bit nos dois arquivos. Assim, em diversos locais onde estão disponíveis downloads de arquivos grandes, os mesmos são acompanhados de hashs de verificação, por exemplo nas páginas de downloads do Linux Mint [3].
Segurança
Acontece que, esses algoritmos matemáticos já são extremamente úteis na verificação da integridade de arquivos, porém, há aplicações que vão além. As hashs são utilizadas para a verificação se dois arquivos são iguais, então, é fácil convencer-se que possivelmente um de seus usos é para checar a existência de arquivos maliciosos (vírus, por exemplo). E é aí que está a chave. Checar o arquivo tentando entender o seu código toda vez que for escanear o computador em busca de arquivos maliciosos seria um processo extremamente lento, então, uma das formas de se procurar por vírus é manter hashs dos arquivos maliciosos já testados positivamente para que, ao se deparar com uma hash idêntica, o software tome as devidas soluções.
É preciso ressaltar que essa não é a única forma que os antivírus trabalham e, ainda, que faltam informações que não são necessárias aqui, já que o intuito do texto é mostrar a aplicabilidades desses algoritmos.
Por último, esses algoritmos são utilizados para salvar senhas de sites. Por exemplo, ao se cadastrar uma senha em algum site com segurança, a senha original não é salva. É salvo uma hash da sua senha. Quando se é necessário verificar a senha, no processo de login, o que se faz é calcular novamente a hash e comparar com a hash armazenada.
Referências
[1] O que é checksum: Aqui[2] Criptografia MD5: Aqui
[3] Linux Mint Verify Your Iso: Aqui
[4] MD5 Algorithm Implementation in Python: Aqui
[5] MD5: Aqui
[6] Vírus Total Support: Aqui