Мне нужно заархивировать файл и защитить его паролем. Есть ли для этого хорошая (бесплатная) библиотека?
Это должно быть открыто третьим лицом, поэтому защита паролем должна работать со стандартными инструментами.
Мне нужно заархивировать файл и защитить его паролем. Есть ли для этого хорошая (бесплатная) библиотека?
Это должно быть открыто третьим лицом, поэтому защита паролем должна работать со стандартными инструментами.
ОБНОВЛЕНИЕ 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
Вы можете попробовать Zip4j, чистую библиотеку Java для работы с zip-файлами. Он поддерживает шифрование / дешифрование методов шифрования PKWare и AES.
Ключевая особенность:
Лицензия:
Это не ответ, но следует помнить об этом при оценке потенциальных решений.
Одна очень важная вещь о zip-шифровании:
Есть несколько типов шифрования почтового индекса. Старый тип (часть исходного стандарта zip) вообще не стоит беспокоить (его можно взломать менее чем за 10 минут с помощью приложений, легко доступных в Интернете).
Если вы выполняете какое-либо шифрование zip-файлов, пожалуйста, убедитесь, что вы используете один из строгих стандартов шифрования (я считаю, что 128- и 256-битный стандарт AES WinZip поддерживается лучше всего). Вот технические характеристики - мы использовали их при разработке нашей собственной системы зашифрованного zip-архива Java (невозможно предоставить источник - извините - это только для внутреннего использования)
Единственное, что хуже, чем отсутствие шифрования, - это думать, что у вас есть шифрование, и ошибаться :-)
7-Zip имеет возможность добавить пароль в режиме командной строки. Возможно, вы можете запустить его, чтобы получить такой результат (и у него также хороший коэффициент сжатия).
Недостатки: внешний процесс, сложно сделать переносимым (даже если 7-Zip сам переносится), не уверен в лицензии на распространение.
Обратите внимание, что служебная программа InfoZip Zip, также очень портативная, также поддерживает пароль.
Вы также можете попробовать TrueZip. Информацию о функциях см. По следующим ссылкам: https://christian-schlichtherle.bitbucket.io/truezip/ а>
Преемника TrueZip можно найти здесь: https://christian-schlichtherle.bitbucket.io/truevfs/
Вот пример использования 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».
Примечание: мне непонятно, зачем нужно дважды указывать пароль в приведенном выше коде. Я не знаю, что бы произошло, если бы вы использовали разные пароли в этих двух местах.
Если вы дадите лучший сценарий использования, тогда есть другие альтернативы.
Для 3 вы можете просто использовать java для шифрования потокового содержимого zip-архива как обычного файла, возможно, лучше всего изменить расширение файла на .ezip или что-то подобное.
Для 1 и 2 вы можете использовать упомянутое решение chillkat или его аналог. Однако имейте в виду, что chillkat не является чисто Java-решением, он использует JNI.
Дополнительная информация: я немного погуглил, и действительно, это довольно частый вопрос, и похоже, что нет бесплатного решения (пока?).
Теперь стандартный алгоритм шифрования Zip четко определен: см. PKWARE. Примечание по применению в формате .ZIP. Похоже, это шифрование зашифрованного потока. Если кому-то захочется его кодировать ...
Теперь мне интересно, почему Sun не включила его в свою библиотеку? Отсутствие стандарта? Патент / юридическая проблема? Слишком слаба, чтобы ее можно было использовать?
Есть ли для этого хорошая (бесплатная) библиотека?
java.util.zip будет архивировать, но не пароли. И нет, я не знаю таких бесплатных. Самый дешевый, который я видел, стоит 150 долларов за рабочее место разработчика.