Контейнер и сжатие — не одно и то же
Под словом «архив» смешивают две разные задачи. Упаковка — это сбор множества файлов в один с сохранением их имён и папок. Сжатие — это уменьшение объёма байтов. TAR только упаковывает: файл .tar весит столько же, сколько всё его содержимое вместе. Gzip только сжимает, причём один поток за раз, — поэтому и существует .tar.gz: сначала упаковать, потом сжать упаковку. ZIP делает и то и другое сразу, для каждого файла отдельно, и ведёт каталог содержимого.
От этой разницы зависит, как формат ведёт себя на практике. ZIP хранит каталог в конце и сжимает каждый файл отдельно, поэтому может мгновенно показать список архива на десять гигабайт и распаковать один файл из середины, не трогая остальные, — именно так и работает наш просмотр ZIP: он ничего не распаковывает, пока вы не попросите. Непрерывный (solid) архив сжимает всё одним сплошным потоком, поэтому находит повторы и между файлами, и результат получается меньше — иногда намного меньше, если файлов много и они похожи, как исходный код или логи. Цена в том, что дешёвого способа добраться до одного файла в середине нет: всё, что лежит перед ним, придётся сначала распаковать. TAR.GZ непрерывен по своей природе, 7z сжимает непрерывными блоками, а RAR здесь читается с самого начала, а не по каталогу.
Уже сжатое повторно не сжимается. В JPEG, PNG, MP3, MP4, PDF и во всех современных файлах Office сжатие встроено, и deflate тратит на них время впустую — а иногда ещё и добавляет несколько байтов. Поэтому ZIP-архив папки с фотографиями выходит того же размера, что и папка, и люди решают, что инструмент сломан. «Создать ZIP-архив» распознаёт такие форматы и сохраняет их как есть, не делая вид, что сжимает, — поэтому с фотографиями он справляется мгновенно, а над текстом работает дольше.
Метаданные в архиве — не те же, что на вашем диске. ZIP хранит время изменения в формате MS-DOS: точность — две секунды, а даты раньше 1980 или позже 2099 года он записать не может. Здесь такие даты приводятся к допустимому диапазону, а не ломают весь архив, — это реальная ошибка, с которой мы столкнулись при конвертации RAR с нулевой датой. TAR хранит права доступа Unix, владельца и символические ссылки. Браузер не может ни прочитать всё это с вашего диска, ни записать обратно, поэтому «Создать TAR-архив» записывает разумные права по умолчанию, а наши инструменты распаковки показывают права и ссылки, но не восстанавливают их. Если архив — это резервная копия, которая должна вернуться ровно в том виде, в каком её сделали, создавать и восстанавливать её нужно утилитой tar на самом компьютере.
Шифрование ZIP бывает двух видов, и чего-то стоит только одно. Исходная схема ZipCrypto взломана настолько, что стала декоративной: атака по известному открытому тексту восстанавливает содержимое за секунды на обычном компьютере, а большинство программ до сих пор предлагают её по умолчанию. Добавленный позже AES-256 — настоящее шифрование, и взломать его нельзя. Здесь нет ни того, ни другого: сломанное мы выпускать не станем, а у современного нет встроенной в браузер реализации, которую можно использовать под свободной лицензией. Полезно знать в любом случае: ZIP никогда не шифрует имена файлов, поэтому каталог зашифрованного архива может прочитать кто угодно. «Invoices/2024/Settlement-confidential.pdf» видно без пароля.
Архив — единственный вид файла, содержимое которого может атаковать открывающую его программу. Файл внутри может называться «../../.bashrc», чтобы выбраться из папки, в которую его распаковывают, а несколько килобайт можно подготовить так, что они развернутся в терабайты и обрушат вкладку. И то и другое обрабатывается до того, как вы что-либо увидите: опасные имена — переходы в родительскую папку, абсолютные пути, буквы дисков Windows, зарезервированные имена устройств, невидимые символы для маскировки расширения — исправляются, и каждое исправление показывается в списке, а коэффициент распаковки измеряется, и подозрительный архив отклоняется, а не распаковывается. Символические ссылки внутри архива показываются, но никогда не открываются.