Comment créer un fichier JAR crypté? [fermé]
je travaille sur un projet qui doit protéger les fichiers de données (révéler le code n'est pas le problème principal). Nous utilisons Java + Netbeans. Y a-t-il une installation qui va créer jar dans un format crypté? Nous utilisons aussi sqlite pour la base de données - donc mettre un fichier texte dans un format crypté n'est pas une option appropriée pour nous aussi.
6 réponses
créer des bocaux cryptés n'est pas possible, puisque JavaVM doit être capable de lire les données qu'il veut exécuter. Et comme pour une MV, il serait possible à n'importe qui disposant des outils et du savoir-faire appropriés d'extraire toutes les données du bocal.
S'il est possible de chiffrer le JAR, vous devrez également fournir une clé de déchiffrement ou une fonction au client qui veut exécuter le JAR, ce qui va à l'encontre du but du chiffrement.
le tout ce que vous pouvez obtenir est l'obscurcissement, mais ce n'est pas une vraie sécurité ou obstacle pour l'attaquant ambitieux.
je suis d'accord avec Kosi2801. Le cryptage de fichiers de classe n'est qu'une imitation de la sécurité (voir http://www.excelsior-usa.com/articles/java-obfuscators.html) L'utilisation de ClassLoader personnalisé peut casser l'application, par exemple dans les serveurs D'Application.
il y a la meilleure façon: utiliser le chiffrement des constantes de chaîne dans les fichiers de classe. La plupart des obfuscators commerciaux ont cette fonction, par exemple Allatori, Stringer Java De La Dissimulation De L'Toolkit, Zelix KlassMaster, écran de fumée, DashO (super cher). Le Stringer Java Obfuscator a vérifier le contexte et les fonctions de contrôle d'intégrité ce qui rend la protection vraiment difficile à pirater.
le moyen le plus sûr est de stocker et d'exécuter des parties de bytecode sur un périphérique externe comme JavaCard.
N.B. je suis PDG de Licel LLC. Développeur de Stringer Java Obfuscator.
Kosi2801 est à peu près à droite sur. La seule chose que je peux penser de vous pourrait faire est la suivante, mais il est laid.
- expédier un petit bocal standard et un fichier de données crypté.
- quand le JAR s'exécute, il déchiffre (en partie) le fichier de données crypté dans la mémoire (comme le répertoire où les données sont dans le JAR, essentiellement un simple système de fichiers en mémoire de paires pointeur/longueur)
- configurer votre propre chargeur de classe qui, lorsqu'il est appelé, obtient le bon cryptage octets à partir du POT (à l'aide de la pseudo-FS tableau décrit au point 2), la déchiffre, puis charge les données de la classe à partir de là
cela vous permettrait de charger les classes. On pourrait faire la même chose (sans le chargeur de classe) pour charger d'autres ressources.
bien que amusant à mettre en œuvre (pour ceux qui aiment un défi) il y a quelques problèmes avec cela:
- vous auriez besoin D'être en mesure de décrypter la substance, de sorte que l'utilisateur devrait soit entrer un mot de passe à chaque fois ou quelque chose de similaire. Si le bocal en sait assez pour se décrypter lui-même, alors n'importe qui peut le regarder et trouver comment décrypter les choses. Cela pourrait être atténué en communiquant avec un serveur sur Internet pour demander la clé de déchiffrement (aussi longtemps que vous faites ce processus sécurisé). Bien sûr, cela nécessite une connexion active 'net chaque fois que quelqu'un veut exécuter le programme.
- Tout se termine dans la mémoire. Sans un JVM personnalisé qui manipule de minuscules bits de chiffrement code octet (comme Cameron McKay l'a mentionné) les classes se retrouveront déchiffrées dans la mémoire principale à un moment donné. À moins que vous ne comptiez sur L'OS pour empêcher les autres de lire ce souvenir, vous avez déjà perdu la bataille pour quiconque avec un peu de temps sur leurs mains. Même problème pour les ressources (comme les images/polices/etc) que vous essayez de lire dans un magasin crypté.
donc vous pouvez donner aux gens le tour-autour et rendre les choses plus difficiles, mais dans la situation vous avez donné tout ce que vous pouvez faire est d'essayer de faire qu'il ne vaut pas le temps que l'autre personne aura à investir.
la protection des logiciels est difficile, en particulier dans quelque chose comme Java qui peut facilement être décomposé et ne peut pas modifier son propre code comme C/Assembly pourrait. Il ya une raison certains des logiciels les plus coûteux là-bas nécessite des dongles matériel ou vient verrouillé à un certain CPU ou d'autres matériels.
En général, il n'y a aucun moyen de le faire de façon sécuritaire, si vous souhaitez que l'application et de ses données, à être autonome. Cependant, vous pouvez certainement crypter les fichiers et les déchiffrer avec une clé enfouie dans le code. Un pirate déterminé peut l'obtenir, mais si ce n'est pas ce qui vous inquiète, alors très bien. Si vous faites cela, rappelez-vous que les données encodées ne peuvent pas être compressées, alors compressez d'abord, puis cryptez.
si vous avez vraiment besoin des données pour être sûr (par exemple, les données confidentielles), vous il faudra chiffrer les données avec une clé et fournir cette clé à l'application par des moyens externes, tels que le mettre sur un lecteur de pouce et le transmettre à l'utilisateur au moyen d'un courrier sécurisé.
une autre possibilité est de rendre les données (ou la clé) disponibles sur SSL, et d'utiliser une bonne méthode d'authentification pour vérifier qui est votre utilisateur.
en général - il n'est pas possible qu'un système soit parfaitement sécurisé, mais ce n'est pas non plus nécessaire. Un système doit seulement être sûr assez pour décourager les agresseurs qui, selon vous, tenteront de la déjouer.
une autre option serait de faire un JVM personnalisé qui décryptait le bocal à la volée. Mais le même problème subsiste: à un moment donné, les classes Java JAR doivent être déchiffrées pour être exécutées par la JVM, et à ce moment-là, elles peuvent être capturées et dé-compilées.
sans mentionner qu'avoir une JVM personnalisée exigerait alors que tous vos utilisateurs téléchargent également cette JVM.
vous pouvez utiliser le CipherOutputStream et le CipherInputStream pour sérialiser des objets Java vers un disque dans un format crypté. Ceci peut être une option ouverte pour sauvegarder des données.