J'ai une application qui utilise le cryptage AES 256 bits qui n'est pas pris en charge par Java prêt à l'emploi. Je sais que pour que cela fonctionne correctement, j'installe les pots JCE de force illimitée dans le dossier de sécurité. Cela me convient en tant que développeur, je peux les installer.
Ma question est que, puisque cette application sera distribuée, les utilisateurs finaux n'auront probablement pas ces fichiers de stratégie installés. Demander à l'utilisateur final de les télécharger uniquement pour faire fonctionner l'application n'est pas une solution attrayante.
Existe-t-il un moyen de faire fonctionner mon application sans écraser les fichiers sur la machine de l'utilisateur final? Un logiciel tiers capable de le gérer sans que les fichiers de stratégie ne soient installés? Ou un moyen de simplement référencer ces fichiers de stratégie à partir d'un JAR?
la source
Réponses:
Il existe quelques solutions couramment citées à ce problème. Malheureusement, aucun de ces éléments n'est entièrement satisfaisant:
Mais ensuite, il y a la réflexion. Y a-t-il quelque chose que vous ne pouvez pas faire en utilisant la réflexion?
Appelez simplement à
removeCryptographyRestrictions()
partir d'un initialiseur statique ou autre avant d'effectuer des opérations cryptographiques.La
JceSecurity.isRestricted = false
partie est tout ce qui est nécessaire pour utiliser directement les chiffrements 256 bits; cependant, sans les deux autres opérations,Cipher.getMaxAllowedKeyLength()
continuera à rapporter 128, et les suites de chiffrement TLS 256 bits ne fonctionneront pas.Ce code fonctionne sur Oracle Java 7 et 8 et ignore automatiquement le processus sur Java 9 et OpenJDK là où il n'est pas nécessaire. Étant un hack laid après tout, cela ne fonctionne probablement pas sur les VM d'autres fournisseurs.
Cela ne fonctionne pas non plus sur Oracle Java 6, car les classes JCE privées y sont masquées. L'obscurcissement ne change pas d'une version à l'autre, il est donc toujours techniquement possible de prendre en charge Java 6.
la source
final
champ dans 8u111, je l'ai modifié pour qu'il puisse changer le champ final, à la suite de cette réponse . Le résultat est à peu près le même que celui de la nouvelle version de ntoskrnl, sauf que je n'ai pas déclarémodifiersField
commefinal
. Un de mes utilisateurs rapporte que cela fonctionne également dans 8u112.Ce n'est plus nécessaire pour Java 9 , ni pour aucune version récente de Java 6, 7 ou 8. Enfin! :)
Par JDK-8170157 , la politique cryptographique illimitée est désormais activée par défaut.
Versions spécifiques du problème JIRA:
Notez que si, pour une raison étrange, l'ancien comportement est nécessaire dans Java 9, il peut être défini en utilisant:
la source
Voici la solution: http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html
la source
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
isRestricted
champ est devenu définitif ( bugs.openjdk.java.net/browse/JDK-8149417 ). La réponse de @ ntoskrnl prend en charge toute inclusion possible d'un modificateur "final". Le commentaire de @ M.Dudley sur le contrat de licence Java s'applique toujours aussi.Bouncy Castle nécessite toujours des bocaux installés pour autant que je sache.
J'ai fait un petit test et cela a semblé le confirmer:
http://www.bouncycastle.org/wiki/display/JA1/Frequency+Asked+Questions
la source
À partir du JDK 8u102, les solutions publiées reposant sur la réflexion ne fonctionneront plus: le champ que ces solutions définissent est maintenant
final
( https://bugs.openjdk.java.net/browse/JDK-8149417 ).On dirait que c'est de retour soit (a) à l'aide de Bouncy Castle, soit (b) à l'installation des fichiers de stratégie JCE.
la source
isRestricted
terrain, car elle prend en charge l'ajout éventuel d'un modificateur "final".Pour une bibliothèque de cryptographie alternative, jetez un œil à Bouncy Castle . Il a AES et de nombreuses fonctionnalités supplémentaires. C'est une bibliothèque open source libérale. Vous devrez cependant utiliser l'API Bouncy Castle légère et propriétaire pour que cela fonctionne.
la source
Vous pouvez utiliser la méthode
pour tester la longueur de clé disponible, utilisez-la et informez l'utilisateur de ce qui se passe. Quelque chose indiquant que votre application retombe aux clés de 128 bits en raison, par exemple, des fichiers de stratégie non installés. Les utilisateurs soucieux de la sécurité installeront les fichiers de stratégie, d'autres continueront à utiliser des clés plus faibles.
la source
Pour notre application, nous avions une architecture client-serveur et nous n'autorisions le déchiffrement / chiffrement des données qu'au niveau du serveur. Par conséquent, les fichiers JCE ne sont nécessaires que là-bas.
Nous avons eu un autre problème où nous devions mettre à jour un fichier jar de sécurité sur les machines clientes, via JNLP, il écrase les bibliothèques
${java.home}/lib/security/
et la JVM lors de la première exécution.Cela l'a fait fonctionner.
la source
Voici une version mise à jour de la réponse ntoskrnl . Il contient en outre une fonction pour supprimer le modificateur final comme Arjan mentionné dans les commentaires.
Cette version fonctionne avec JRE 8u111 ou plus récent.
la source
((Map<?, ?>) perms.get(defaultPolicy)).clear();
génère une erreur de compilation. Les commentaires ne semblent pas avoir d'incidence sur sa fonctionnalité. Cette ligne est-elle nécessaire?Voici une version modifiée du code de @ ntoskrnl avec
isRestrictedCryptography
vérification par journalisation slf4j réelleCipher.getMaxAllowedKeyLength
et prise en charge de l'initialisation singleton à partir du démarrage de l'application comme ceci:Ce code arrêterait correctement de se gâter avec la réflexion lorsque la politique illimitée deviendrait disponible par défaut dans Java 8u162 comme le prédit la réponse de @ cranphin.
la source
Lors de l'installation de votre programme, demandez simplement à l'utilisateur de télécharger un script DOS Batch ou un script shell Bash et copiez le JCE dans l'emplacement système approprié.
J'avais l'habitude de le faire pour un service Web de serveur et au lieu d'un programme d'installation formel, je viens de fournir des scripts pour configurer l'application avant que l'utilisateur ne puisse l'exécuter. Vous pouvez rendre l'application non exécutable jusqu'à ce qu'elle exécute le script de configuration. Vous pouvez également faire en sorte que l'application se plaigne de l'absence de JCE, puis demander à télécharger et à redémarrer l'application?
la source