Recomendaciones sobre una biblioteca gratuita que se utilizará para comprimir archivos

Necesito comprimir y proteger con contraseña un archivo. ¿Hay una buena biblioteca (gratuita) para esto?

Esto debe ser abierto por un tercero, por lo que la protección con contraseña debe funcionar con herramientas estándar.

    Después de mucho buscar, encontré tres enfoques:

    Un conjunto de código fuente disponible libremente, adecuado para un archivo zip único. Sin embargo, no hay licencia. El uso es AesZipOutputStream.zipAndEcrypt (…). http://merkert.de/de/info/zipaes/src.zip ( https://forums.oracle.com/forums/thread.jspa?threadID=1526137 )

    ACTUALIZACIÓN: Este código ahora tiene licencia de Apache y se ha publicado en http://code.google.com/p/winzipaes/ . Funcionó para mí (un archivo en el zip) y llena un agujero en las bibliotecas fuente de Java.

    Un producto comercial ($ 500 en el momento de la escritura). No puedo verificar si esto funciona, ya que su enfoque de licencia de prueba es complejo. También es una aplicación .NET portada: http://www.nsoftware.com/ipworks/zip/default.aspx

    Un producto comercial ($ 290 al momento de escribir). Adecuado solo para Wnidows, ya que utiliza un dll: http://www.example-code.com/java/zip.asp

    Puede probar Zip4j , una biblioteca java pura para manejar archivos comprimidos. Es compatible con el cifrado / descifrado de los métodos de encriptación PKWare y AES.

    Principales características:

    • Crear, Agregar, Extraer, Actualizar, Eliminar archivos de un archivo Zip
    • Leer / Escribir archivos Zip protegidos con contraseña
    • Admite el cifrado AES 128/256
    • Admite cifrado Zip estándar
    • Admite formato Zip64
    • Compatible con Store (sin compresión) y desinflar el método de compresión
    • Crear o extraer archivos de archivos Zip divididos (por ejemplo: z01, z02, … zip)
    • Admite nombres de archivos Unicode
    • Monitor de progreso

    Licencia:

    • Zip4j se lanzó bajo Apache License, Version 2.0 .

    Esta no es una respuesta, pero es una precaución a tener en cuenta cuando se evalúan soluciones potenciales.

    Una cosa muy importante sobre el cifrado zip:

    Hay varios tipos de cifrado zip. No vale la pena preocuparse por el tipo antiguo (parte del estándar zip original) (se puede descifrar en menos de 10 minutos con aplicaciones fácilmente disponibles en línea).

    Si está realizando algún tipo de cifrado de archivos comprimidos, asegúrese de utilizar uno de los estándares de cifrado más sólidos (creo que el estándar AES de 128 y 256 bits de WinZip es el mejor admitido). Aquí están las especificaciones técnicas : lo usamos al desarrollar nuestro propio sistema zip cifrado de Java (no podemos proporcionar la fuente, lo sentimos, solo es de uso interno)

    Lo único peor que no tener encriptación es pensar que tienes cifrado y estar equivocado 🙂

    7-Zip tiene la opción de agregar una contraseña en su modo de línea de comandos. Tal vez puedas ejecutarlo para obtener este resultado (y también tiene una buena ración de compresión).

    Inconvenientes: proceso externo, difícil de hacer portátil (incluso si 7-Zip es portátil), no estoy seguro de la licencia de distribución.

    Tenga en cuenta que la utilidad Zip de InfoZip, también muy portátil, también admite la contraseña.

    También puedes probar TrueZip. Vea los siguientes enlaces para las características: https://christian-schlichtherle.bitbucket.io/truezip/

    El sucesor de TrueZip se puede encontrar aquí: https://christian-schlichtherle.bitbucket.io/truevfs/

    Aquí hay un ejemplo usando winzipaes 1.0.1. Tenga en cuenta que esto es solo una esencia, no he probado este código exactamente en esta forma.

    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(); 

    Puedes descomprimir “/tmp/foo.zip” usando Winzip (v9 +) o 7za (es decir, 7zip) en una Mac, usando la contraseña “mi-contraseña”.

    Nota: no me queda claro por qué es necesario especificar la contraseña dos veces en el código anterior. No sé qué pasaría si usaras diferentes contraseñas en estos dos lugares.

    Si le da un mejor escenario de uso, entonces hay otras alternativas.

    1. ¿Necesita que se abra el zip con las herramientas Zip estándar que pueden manejar una contraseña de zip?
    2. La misma pregunta que el anterior ¿Vas a pasar este zip a una entidad externa que tiene que abrir el zip?
    3. ¿Es solo interno y solo quieres proteger el contenido del zip?

    Para 3, puede usar java para encriptar los contenidos del archivo zip como un archivo normal, probablemente sea mejor cambiar la extensión del archivo a .ezip o también a algo así.

    Para 1 y 2, puedes usar la solución de chillkat como se mencionó, o un equivalente. Sin embargo, tenga en cuenta que chillkat no es una solución pura de Java, sino que utiliza JNI.

    Información adicional: busqué en Google un poco más y, de hecho, es una pregunta bastante común, y parece que no hay una solución gratuita (¿todavía?).

    Ahora, el algoritmo estándar de cifrado Zip está bien definido: consulte la Nota de aplicación de PKWARE en el formato de archivo .ZIP. Parece ser una encriptación hecha en la secuencia encriptada. Si alguien tiene ganas de codificarlo …

    Ahora, me pregunto por qué Sun no lo incluyó en su biblioteca. La falta de estándar? ¿Problema de patente / legal? Demasiado débil para ser utilizable?

    ¿Hay una buena biblioteca (gratuita) para esto?

    java.util.zip hará la compresión, pero no hará las contraseñas. Y no, no conozco ninguna gratis que lo haga. El más barato que he visto es de $ 150 para un asiento de desarrollador.