Empacotar e comprimir não são a mesma coisa
Duas tarefas diferentes se misturam sob a expressão “arquivo compactado”. Empacotar é colocar muitos arquivos dentro de um só, mantendo nomes e pastas. Comprimir é deixar os bytes menores. O TAR só empacota — um .tar tem o tamanho de tudo o que está dentro somado. O gzip só comprime, e apenas um fluxo por vez, e é por isso que o .tar.gz existe: primeiro empacota, depois espreme o pacote. O ZIP faz as duas coisas ao mesmo tempo, arquivo por arquivo, e mantém um catálogo do que há dentro.
Essa diferença determina como o formato se comporta na prática. Como o ZIP guarda um catálogo no final e comprime cada arquivo separadamente, ele consegue listar um arquivo compactado de dez gigabytes na hora e extrair um único arquivo do meio sem mexer no resto — que é exatamente o que o nosso leitor de ZIP faz, sem descomprimir nada até você pedir alguma coisa. Um arquivo compactado sólido comprime tudo como um único fluxo contínuo, então as repetições entre arquivos diferentes são aproveitadas e o resultado fica menor, às vezes bem menor quando há muitos arquivos pequenos e parecidos, como código-fonte ou logs. O preço é que não existe um jeito barato de chegar a um arquivo do meio: tudo o que vem antes precisa ser descomprimido primeiro. O TAR.GZ é sólido por natureza, o 7z comprime em blocos sólidos, e aqui um RAR é lido do começo ao fim, e não a partir de um catálogo.
Conteúdo que já está comprimido não comprime de novo. JPEG, PNG, MP3, MP4, PDF e todos os arquivos modernos do Office já têm compressão embutida, e o deflate gasta tempo com eles sem conseguir nada — às vezes ainda acrescenta alguns bytes. É por isso que um ZIP de uma pasta de fotos sai do mesmo tamanho da pasta e as pessoas acham que a ferramenta está com defeito. Criar arquivo ZIP reconhece esses formatos e os guarda como estão em vez de fingir que comprime, e é por isso que termina na hora com fotografias e demora mais com texto.
Os metadados que um arquivo compactado carrega não são os que o seu disco tem. O ZIP guarda as datas de modificação no formato do MS-DOS, que tem resolução de dois segundos e não consegue representar datas antes de 1980 nem depois de 2099 — aqui, datas fora desse intervalo são ajustadas ao limite em vez de fazerem o arquivo compactado inteiro falhar, um bug real que encontramos ao converter RARs com data zero. O TAR guarda permissões Unix, proprietário e links simbólicos. O navegador não consegue ler nada disso do seu disco nem gravar de volta, então Criar arquivo TAR grava um modo padrão sensato, e os nossos descompactadores listam permissões e links em vez de restaurá-los. Se o arquivo compactado é um backup que precisa voltar exatamente como entrou, ele deve ser criado e restaurado pelo tar na própria máquina.
A criptografia de ZIP existe em dois tipos, e só um deles vale alguma coisa. O esquema original, o ZipCrypto, está tão quebrado que é praticamente decorativo — um ataque de texto conhecido recupera o conteúdo em segundos num computador comum, e a maioria dos programas ainda o oferece como padrão. O AES-256, adicionado depois, é criptografia de verdade e não dá para quebrar. Nenhum dos dois é oferecido aqui: não vamos entregar o quebrado, e o moderno não tem uma implementação nativa do navegador que possamos usar sob uma licença permissiva. Vale saber de qualquer forma: o ZIP nunca criptografa os nomes dos arquivos, então o catálogo de um arquivo compactado criptografado pode ser lido por qualquer pessoa. “Faturas/2024/Acordo-confidencial.pdf” aparece sem a senha.
O arquivo compactado é o único tipo de arquivo cujo conteúdo pode atacar o programa que o abre. Um arquivo lá dentro pode se chamar “../../.bashrc” para escapar da pasta onde é extraído, e alguns kilobytes podem ser montados para se expandir em terabytes e derrubar a aba. As duas coisas são tratadas antes de você ver qualquer coisa: nomes hostis — subidas para a pasta pai, caminhos absolutos, letras de unidade do Windows, nomes reservados de dispositivo, caracteres invisíveis usados para disfarçar uma extensão — são corrigidos e cada correção é listada, e as taxas de expansão são medidas e recusadas em vez de testadas. Links simbólicos dentro de um arquivo compactado são exibidos, mas nunca seguidos.