web-dev-qa-db-fra.com

Recommandations sur une bibliothèque gratuite à utiliser pour compresser des fichiers

J'ai besoin de Zip et de protéger un fichier par mot de passe. Existe-t-il une bonne bibliothèque (gratuite) pour cela?

Cela doit être ouvert par un tiers, de sorte que la protection par mot de passe doit fonctionner avec des outils standard.

72
nearly_lunchtime

Après de longues recherches, j'ai trouvé trois approches:

Un ensemble de code source disponible gratuitement, adapté à un seul fichier Zip. Cependant, il n'y a pas de licence. L'utilisation est AesZipOutputStream.zipAndEcrypt (...). http://merkert.de/de/info/zipaes/src.Zip ( https://forums.Oracle.com/forums/thread.jspa?threadID=1526137 =)

MISE À JOUR: Ce code est désormais sous licence Apache et publié sur http://code.google.com/p/winzipaes/ . Cela a fonctionné pour moi (un fichier dans le Zip), et remplit bien un trou dans les bibliothèques open source de Java.

Un produit commercial (500 $ au moment de la rédaction). Je ne peux pas vérifier si cela fonctionne, car leur approche de licence d'essai est complexe. C'est également une application .NET portée: http://www.nsoftware.com/ipworks/Zip/default.aspx

Un produit commercial (290 $ au moment de la rédaction). Convient uniquement pour Wnidows car il utilise une DLL: http://www.example-code.com/Java/Zip.asp

32
JodaStephen

Vous pouvez essayer Zip4j , une pure bibliothèque Java pour gérer le fichier Zip. Il prend en charge le cryptage/décryptage de PKWare et les méthodes de cryptage AES.

Principales caractéristiques:

  • Créer, ajouter, extraire, mettre à jour, supprimer des fichiers d'un fichier Zip
  • Lire/écrire des fichiers Zip protégés par mot de passe
  • Prend en charge le cryptage AES 128/256
  • Prend en charge le cryptage Zip standard
  • Prend en charge le format Zip64
  • Prend en charge la méthode de compression Store (No Compression) et Deflate
  • Créer ou extraire des fichiers à partir de fichiers Zip fractionnés (Ex: z01, z02, ... Zip)
  • Prend en charge les noms de fichiers Unicode
  • Moniteur de progression

Licence:

48
Matt

Ce n'est pas une réponse, mais c'est une prudence à garder à l'esprit lors de l'évaluation des solutions potentielles.

Une chose très importante à propos du cryptage Zip:

Il existe plusieurs types de cryptage Zip. L'ancien type (qui fait partie de la norme Zip d'origine) ne vaut pas la peine d'être dérangé (il peut être craqué en moins de 10 minutes avec des applications facilement disponibles en ligne).

Si vous effectuez une sorte de cryptage des fichiers Zip, veuillez vous assurer que vous utilisez l'une des normes de cryptage strictes (je crois que la norme AES 128 et 256 bits de WinZip est la meilleure prise en charge). Voici les spécifications techniques - nous l'avons utilisé lors du développement de notre propre système de cryptage Zip Java crypté (ne peut pas fournir la source - désolé - c'est un usage interne uniquement))

La seule chose pire que de ne pas avoir de cryptage, c'est de penser que vous avez un cryptage et de vous tromper :-)

11
Kevin Day

7-Zip a la possibilité d'ajouter un mot de passe en mode ligne de commande. Vous pouvez peut-être l'exécuter pour obtenir ce résultat (et il a aussi une bonne ration de compression).

Inconvénients: processus externe, difficile à rendre portable (même si 7-Zip est portable lui-même), pas sûr de la licence de distribution.

Notez que l'utilitaire Zip d'InfoZip, également très portable, prend également en charge le mot de passe.

4
PhiLho

Vous pouvez également essayer TrueZip. Voir les liens suivants pour les fonctionnalités: https://christian-schlichtherle.bitbucket.io/truezip/

Le successeur de TrueZip est disponible ici: https://christian-schlichtherle.bitbucket.io/truevfs/

3
Kai Mechel

Voici un exemple utilisant winzipaes 1.0.1. Notez que ce n'est qu'un Gist, je n'ai pas testé ce code exactement sous cette forme.

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

Vous pouvez les décompresser "/tmp/foo.Zip" en utilisant Winzip (v9 +) ou 7za (c'est-à-dire 7Zip) sur un Mac, en utilisant le mot de passe "my-password".

Remarque: je ne comprends pas pourquoi il est nécessaire de spécifier le mot de passe deux fois dans le code ci-dessus. Je ne sais pas ce qui se passerait si vous utilisiez des mots de passe différents à ces deux endroits.

2
Marc

Si vous donnez un meilleur scénario d'utilisation, il existe d'autres alternatives.

  1. Souhaitez-vous que le Zip soit ouvert par les outils Zip standard qui peuvent gérer un mot de passe Zip?
  2. La même question que précédemment allez-vous transmettre ce Zip à une entité externe qui doit ouvrir le zip?
  3. Est-ce uniquement interne et vous souhaitez simplement protéger le contenu du zip?

Pour 3, alors vous pouvez simplement utiliser Java pour crypter le contenu du flux de Zip en tant que fichier normal, probablement préférable de changer l'extension de fichier en .ezip ou somesuch aussi.

Pour 1 et 2, vous pouvez utiliser la solution chillkat comme mentionné, ou un équivalent. Cependant, sachez que chillkat n'est pas une pure Java, elle utilise JNI.

1
Donal Tobin

Informations supplémentaires: j'ai googlé un peu plus et en effet, c'est une question assez courante, et il semble qu'il n'y ait pas (encore?) De solution gratuite.

Maintenant, l'algorithme standard de cryptage Zip est bien défini: Voir PKWARE Application Note sur le format de fichier .Zip. Il semble s'agir d'un chiffrement effectué sur le flux chiffré. Si quelqu'un a envie de le coder ...

Maintenant, je me demande pourquoi Sun ne l'a pas inclus dans sa bibliothèque? Manque de standard? Brevet/problème juridique? Trop faible pour être utilisable?

1
PhiLho

Existe-t-il une bonne bibliothèque (gratuite) pour cela?

Java.util.Zip fera le zipping, mais pas les mots de passe. Et non, je n'en connais pas de libres. Le moins cher J'ai vu 150 $ pour un siège développeur.

0
Oli