Рекомендации по использованию бесплатной библиотеки для архивирования файлов

Мне нужно заархивировать файл и защитить его паролем. Есть ли для этого хорошая (бесплатная) библиотека?

Это должно быть открыто третьим лицом, поэтому защита паролем должна работать со стандартными инструментами.


person nearly_lunchtime    schedule 03.10.2008    source источник
comment
Как был закрыт такой полезный вопрос?   -  person Dmitry Zaytsev    schedule 28.05.2014
comment
Потому что Мета решила, что полезные вопросы, которые могут хоть немного превратиться в мнения, не подходят для StackOverflow. Это печально, но факт.   -  person user314104    schedule 27.10.2014
comment
Zip4j поддерживает шифрование списка файлов: stackoverflow.com/questions/15085249/   -  person kinjelom    schedule 10.01.2017


Ответы (9)


ОБНОВЛЕНИЕ 2020: теперь есть и другие варианты, в частности Zip4J.


После долгих поисков я нашел три подхода:

Свободно доступный набор исходного кода, подходящий для одного zip файла. Однако лицензии нет. Используется AesZipOutputStream.zipAndEcrypt (...). http://merkert.de/de/info/zipaes/src.zip (https://forums.oracle.com/forums/thread.jspa?threadID=1526137)

ОБНОВЛЕНИЕ: этот код теперь лицензирован Apache и выпущен по адресу https://github.com/mobsandgeeks/winzipaes (экспортировано из исходного дома в код Google). У меня это сработало (один файл в zip-архиве) и прекрасно заполняет дыры в библиотеках с открытым исходным кодом Java.

Коммерческий продукт (500 долларов на момент написания). Я не могу проверить, работает ли это, поскольку их подход к пробной лицензии сложен. Это также перенесенное приложение .NET: http://www.nsoftware.com/ipworks/zip/default.aspx

Коммерческий продукт (290 долларов на момент написания). Подходит только для Wnidows, поскольку использует dll: http://www.example-code.com/java/zip.asp

person JodaStephen    schedule 25.03.2009
comment
Есть ли у кого-нибудь ссылка на то, как использовать код winzipaes, размещенный в этой ссылке? Мне нужно добавить более одного файла, и я мог бы немного помочь понять, как его использовать - person frak; 16.10.2011
comment
@frak Посмотрите исходный код AesFileEncrypter: все, что вам нужно сделать, это создать экземпляр этого класса, а затем добавить к нему все, что вы хотите. - person Christopher Schultz; 14.08.2012
comment
winzipaes доступен через репозиторий Maven mvnrepository.com/artifact/de.idyl/winzipaes - person Marc; 24.10.2012

Вы можете попробовать Zip4j, чистую библиотеку Java для работы с zip-файлами. Он поддерживает шифрование / дешифрование методов шифрования PKWare и AES.

Ключевая особенность:

  • Создание, добавление, извлечение, обновление, удаление файлов из Zip-файла
  • Чтение / запись защищенных паролем Zip-файлов
  • Поддерживает шифрование AES 128/256
  • Поддерживает стандартное шифрование Zip
  • Поддерживает формат Zip64
  • Поддерживает метод сжатия Store (без сжатия) и Deflate
  • Создание или извлечение файлов из файлов Split Zip (например, z01, z02, ... zip)
  • Поддерживает имена файлов Unicode
  • Монитор прогресса

Лицензия:

person Matt    schedule 06.11.2011
comment
И с Android тоже отлично работает :) Отличная библиотека с отличными примерами +1! - person Jay Sidri; 03.10.2012
comment
Похоже, Zip4j заброшен: - / - person Patrick Cornelissen; 14.07.2015
comment
все еще работает. - person Deniss M.; 11.11.2016
comment
@PatrickCornelissen Он был заброшен в течение нескольких лет, но снова в поддержке с середины 2019 года. - person Srikanth Reddy Lingala; 23.05.2020

Это не ответ, но следует помнить об этом при оценке потенциальных решений.

Одна очень важная вещь о zip-шифровании:

Есть несколько типов шифрования почтового индекса. Старый тип (часть исходного стандарта zip) вообще не стоит беспокоить (его можно взломать менее чем за 10 минут с помощью приложений, легко доступных в Интернете).

Если вы выполняете какое-либо шифрование zip-файлов, пожалуйста, убедитесь, что вы используете один из строгих стандартов шифрования (я считаю, что 128- и 256-битный стандарт AES WinZip поддерживается лучше всего). Вот технические характеристики - мы использовали их при разработке нашей собственной системы зашифрованного zip-архива Java (невозможно предоставить источник - извините - это только для внутреннего использования)

Единственное, что хуже, чем отсутствие шифрования, - это думать, что у вас есть шифрование, и ошибаться :-)

person Kevin Day    schedule 04.10.2008
comment
Вы можете поддержать обоих. Zip-файлы с шифрованием AES, aFAIK, еще не поддерживаются проводником Windows, в то время как zip-файлы с шифрованием PKZIP поддерживаются. Вы можете просматривать записи любого типа зашифрованного zip-файла, но вы можете извлечь его только из zip-файла, зашифрованного PKZIP (слабо зашифрованного), с помощью проводника Windows. Вам понадобится WinZip или другой подходящий инструмент в Windows, чтобы открывать zip-архивы с шифрованием AES. (Бесплатный DotNetZip поставляется с таким инструментом). - person Cheeso; 11.05.2009
comment
Как Windows XP SP3, так и Vista поддерживают zip-файлы AES. Мое мнение (с которым все могут не согласиться) заключается в том, что поддержка чего-то, что даже отдаленно не защищено, - плохая идея. M $, не поддерживающий безопасный формат, не является веской причиной для реализации чего-то небезопасного. - person Kevin Day; 13.05.2009
comment
Файлы .zip, созданные Winzipaes (см. Выше), не открываются в моем обновленном образе Windows XP здесь, Windows жалуется на неподдерживаемую схему сжатия. Однако они открывают штраф с 7z. - person Tom Chiverton; 05.07.2011

7-Zip имеет возможность добавить пароль в режиме командной строки. Возможно, вы можете запустить его, чтобы получить такой результат (и у него также хороший коэффициент сжатия).

Недостатки: внешний процесс, сложно сделать переносимым (даже если 7-Zip сам переносится), не уверен в лицензии на распространение.

Обратите внимание, что служебная программа InfoZip Zip, также очень портативная, также поддерживает пароль.

person PhiLho    schedule 03.10.2008
comment
Я считаю, что в 7-zip есть библиотеки для использования в самописных программах, так что это не обязательно должен быть внешний процесс. - person Quagmire; 15.10.2009
comment
@Quagmire 7-zip не имеет собственной сборки Java (за исключением алгоритма LZMA), поэтому использование 7z для работы с ZIP-файлами потребует внешнего процесса. - person Christopher Schultz; 14.08.2012
comment
@ChristopherSchultz действительно. Я полагаю, что можно также написать оболочку JNI или JNA для меньших проблем. - person PhiLho; 28.08.2012
comment
Также стоит отметить, что пароль, совместимый с ZIP 2.0, ужасно взломан и не должен использоваться ни для чего другого, кроме как не позволять малышам просматривать ваши файлы. - person Christopher Schultz; 30.08.2012

Вы также можете попробовать TrueZip. Информацию о функциях см. По следующим ссылкам: https://christian-schlichtherle.bitbucket.io/truezip/

Преемника TrueZip можно найти здесь: https://christian-schlichtherle.bitbucket.io/truevfs/

person Kai Mechel    schedule 24.11.2010
comment
Хотел бы я увидеть это раньше, Zip4j в порядке, но это лучше. В частности, он обрабатывает более широкий диапазон входных данных, таких как самораспаковывающиеся и вложенные zip-файлы и другие математические данные, и от него не отказываются. - person thyme; 25.02.2016

Вот пример использования winzipaes 1.0.1. Обратите внимание, это всего лишь суть, я не тестировал этот код именно в такой форме.

import de.idyl.winzipaes.AesZipFileEncrypter;
import de.idyl.winzipaes.impl.AESEncrypterBC;

File aNewZipFile = new File("/tmp/foo.zip");
File existingUnzippedFile = new File("/tmp/src.txt");

// We use the bouncy castle encrypter, as opposed to the JCA encrypter
AESEncrypterBC encrypter = new AESEncrypterBC();
encrypter.init("my-password", 0);  // The 0 is keySize, it is ignored for AESEncrypterBC

AesZipFileEncrypter zipEncrypter = new AesZipFileEncrypter(aNewZipFile, encrypter);
zipEncrypter.add(existingUnzippedFile, "src.txt", "my-password"); 

// remember to close the zipEncrypter
zipEncrypter.close();

Вы можете распаковать «/tmp/foo.zip» с помощью Winzip (v9 +) или 7za (например, 7zip) на Mac, используя пароль «my-password».

Примечание: мне непонятно, зачем нужно дважды указывать пароль в приведенном выше коде. Я не знаю, что бы произошло, если бы вы использовали разные пароли в этих двух местах.

person Marc    schedule 24.10.2012

Если вы дадите лучший сценарий использования, тогда есть другие альтернативы.

  1. Требуется ли, чтобы почтовый индекс открывался стандартными инструментами, поддерживающими zip-пароль?
  2. Тот же вопрос, что и в предыдущем случае, собираетесь ли вы передать этот zip внешнему объекту, который должен открыть zip?
  3. Это только для внутреннего использования, и вы просто хотите защитить содержимое zip-архива?

Для 3 вы можете просто использовать java для шифрования потокового содержимого zip-архива как обычного файла, возможно, лучше всего изменить расширение файла на .ezip или что-то подобное.

Для 1 и 2 вы можете использовать упомянутое решение chillkat или его аналог. Однако имейте в виду, что chillkat не является чисто Java-решением, он использует JNI.

person Donal Tobin    schedule 03.10.2008
comment
Chillkat не бесплатен, это пробная версия. - person James Schek; 07.10.2008

Дополнительная информация: я немного погуглил, и действительно, это довольно частый вопрос, и похоже, что нет бесплатного решения (пока?).

Теперь стандартный алгоритм шифрования Zip четко определен: см. PKWARE. Примечание по применению в формате .ZIP. Похоже, это шифрование зашифрованного потока. Если кому-то захочется его кодировать ...

Теперь мне интересно, почему Sun не включила его в свою библиотеку? Отсутствие стандарта? Патент / юридическая проблема? Слишком слаба, чтобы ее можно было использовать?

person PhiLho    schedule 03.10.2008
comment
Я сделал именно это около 5 лет назад для одного из наших приложений. Это потребовало некоторых усилий (и я, к сожалению, не могу опубликовать для этого код), но хорошо знать, что это можно сделать. Мы фактически внедрили систему надежного шифрования AES, продвигаемую WinZip. - person Kevin Day; 04.10.2008

Есть ли для этого хорошая (бесплатная) библиотека?

java.util.zip будет архивировать, но не пароли. И нет, я не знаю таких бесплатных. Самый дешевый, который я видел, стоит 150 долларов за рабочее место разработчика.

person Oli    schedule 03.10.2008