Comment éviter d'installer “Force irrésistible” JCE fichiers de stratégie de déploiement d'une application?
J'ai une application qui utilise le chiffrement AES 256 bits qui n'est pas pris en charge par Java hors de la boîte. Je sais que pour obtenir que cela fonctionne correctement j'ai installer la JCE force illimitée, pots dans le dossier de sécurité. Ce qui est bien pour moi d'être développeur, je peux les installer.
Ma question est depuis cette application sera distribué à la fin la plupart des utilisateurs ne sera probablement pas avoir ces fichiers installés. Avoir la fin de l'utilisateur de télécharger ces juste pour faire de l'application de la fonction n'est pas une solution intéressante.
Est-il un moyen de rendre mon application de fonctionner sans écraser les fichiers sur l'utilisateur dans la machine? Un logiciel de tierce partie qui peut s'en occuper sans la politique de fichiers installés? Ou un moyen de référence de ces fichiers dans un BOCAL?
- Jetez un oeil ici: docs.oracle.com/javase/1.5.0/docs/guide/security/jce/...
- Reportez-vous à Comment installer Java Cryptography Extension illimitée de la force de la compétence de la politique de fichiers
- Je soupçonne Sun/Oracle intention était que le client utiliserait moins sûr de chiffrement, de sorte que la NSA peut espionner la connexion . Je ne suis pas plaisanter ou être paranoïaque, mais la cryptographie est considérée comme une arme, et il y a les interdictions à l'exportation sur le partage de chiffrement.
Vous devez vous connecter pour publier un commentaire.
Il y a quelques couramment cité des solutions à ce problème. Malheureusement, aucune de ces sont entièrement satisfaisant:
Mais ensuite, il y a de la réflexion. Est-ce que vous ne pouvez pas le faire à l'aide de la réflexion?
Appelez simplement
removeCryptographyRestrictions()
à partir d'un initialiseur statique ou tel avant d'effectuer des opérations cryptographiques.La
JceSecurity.isRestricted = false
partie est tout ce qui est nécessaire pour l'utilisation de 256 bits algorithmes directement; cependant, sans les deux autres opérations,Cipher.getMaxAllowedKeyLength()
sera toujours maintenir les rapports de 128 et 256-bit de chiffrement TLS suites ne fonctionne pas.Ce code fonctionne sur Oracle Java 7 et 8, et saute automatiquement le processus de Java 9 et OpenJDK où il n'est pas nécessaire. Étant un vilain hack après tout, cela ne fonctionne pas sur les autres fournisseurs de machines virtuelles.
Il ne fonctionne pas sur Oracle Java 6, parce que le privé JCE classes sont obscurcis là. La dissimulation ne change pas d'une version à l'autre, donc il est toujours techniquement possible à l'appui de Java 6.
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
final
champ dans 8u111, je l'ai modifié de sorte qu'il peut modifier le champ final, à la suite de cette répondre. Le résultat est le même que ntoskrnl de la nouvelle version, sauf que je n'avais pas déclarermodifiersField
commefinal
. Un de mes utilisateurs des rapports qu'il fonctionne dans 8u112 ainsi.Cela est désormais plus nécessaire pour Java 9, ni pour toute récente version de Java 6, 7 ou 8. Enfin!!! 🙂
Par JDK-8170157, l'illimité de la stratégie de chiffrement est maintenant activé par défaut.
Des versions spécifiques de l'JIRA question:
Noter que si, pour une raison étrange, l'ancien comportement est nécessaire en Java 9, il peut être défini à l'aide de:
Voici la solution: http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
isRestricted
champ est devenue définitive (bugs.openjdk.java.net/browse/JDK-8149417). @ntoskrnl la réponse prend soin de tout à l'inclusion éventuelle d'une "finale" modificateur. @M. Dudley commentaire sur le Java Accord de Licence s'applique toujours trop.Château gonflable nécessite encore des pots installé aussi loin que je peux dire.
J'ai fait un petit test et il semblait confirmer cette:
http://www.bouncycastle.org/wiki/display/JA1/Frequently+Demande+Questions
De JDK 8u102, la posté des solutions en s'appuyant sur la réflexion ne fonctionne plus: le champ de ces solutions est maintenant
final
(https://bugs.openjdk.java.net/browse/JDK-8149417).On dirait qu'il est de retour soit (un) à l'aide de Château Gonflable, ou (b) l'installation de l'entreprise criminelle commune, la politique de fichiers.
isRestricted
champ, car il prend soin d'un ajout possible d'une "finale" modificateur.Une alternative à la bibliothèque de cryptographie, jetez un oeil à Château Gonflable. Il a AES et beaucoup de fonctionnalités supplémentaires. C'est un libéral de la bibliothèque open source. Vous devrez utiliser à la légère, propriétaire de Château Gonflable API pour que cela fonctionne bien.
Vous pouvez utiliser la méthode
pour tester la disponible la longueur de la clé, l'utiliser et d'en informer l'utilisateur sur ce qui se passe. Quelque chose indiquant que votre demande est en recul pour les clés 128 bits en raison de la politique de fichiers n'étant pas installé, par exemple. Conscientes de la sécurité des utilisateurs va installer les fichiers de stratégie, d'autres vont continuer à utiliser les plus faibles clés.
Pour notre application, nous avons eu une architecture client /serveur et nous a permis de décryptage/le cryptage des données au niveau du serveur. D'où la JCE fichiers ne sont requises.
Nous avons eu un autre problème dont on avait besoin pour mettre à jour un pot de sécurité sur les machines client, par le biais de JNLP, il remplace les bibliothèques dans
${java.home}/lib/security/
et la JVM lors de la première exécution.Qui fait le travail.
Voici une version mise à jour de ntoskrnl réponse.
Il contient en outre une fonction pour supprimer le dernier modificateur comme Arjan mentionné dans les commentaires.
Cette version fonctionne avec le JRE 8u111 ou plus récent.
((Map<?, ?>) perms.get(defaultPolicy)).clear();
donne une erreur de compilation. Commentant ne semble pas avoir un impact sur sa fonctionnalité. Est-ce la ligne nécessaire?Ici est une version modifiée de @ntoskrnl du code mettant en vedette
isRestrictedCryptography
vérifier par réelChiffrement.getMaxAllowedKeyLength
, slf4j la journalisation et le soutien de singleton de l'initialisation de l'application de bootstrap comme ceci:Ce code correctement cesser de déformation avec la réflexion lors de l'illimité politique devient disponible par défaut en Java 8u162 comme @cranphin la réponse de prédit de.
Lors de l'installation de votre programme, il suffit de demander à l'utilisateur et avoir un DOS script Batch ou un shell Bash script de téléchargement et la copie de la JCE dans le bon emplacement du système.
J'ai l'habitude de le faire pour un serveur webservice et au lieu d'une mise en installer, je viens de scripts fournis pour l'installation de l'application avant que l'utilisateur puisse l'exécuter. Vous pouvez faire de l'application de l'onu-praticable jusqu'à ce qu'ils exécutez le script d'installation. Vous pouvez également en faire l'application se plaignent que la JCE est manquant et ensuite demander de télécharger et redémarrez l'application?