Sécurité Java: taille de clé illégale ou paramètres par défaut?

j'avais posé une question à ce sujet plus tôt, mais il n'a pas été répondu correctement et conduit nulle part.

donc j'ai clarifié quelques détails sur le problème et je voudrais vraiment entendre vos idées sur la façon dont je pourrais corriger ceci ou ce que je devrais essayer.

j'ai Java 1.6.0.12 installé sur mon serveur Linux et le code ci-dessous fonctionne parfaitement.

String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
    Cipher c = Cipher.getInstance("ARCFOUR");

    SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
    c.init(Cipher.DECRYPT_MODE, secretKeySpec);

    return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");

} catch (InvalidKeyException e) {
    throw new CryptoException(e);
}

Aujourd'hui j'ai installé Java 1.6.0.26 sur mon serveur et quand j'essaie de lancer mon application, j'obtiens l'exception suivante. À mon avis, cela a quelque chose à voir avec la configuration de L'installation Java parce que cela fonctionne dans la première version, mais ne fonctionne pas dans la version ultérieure.

Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
    at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
    ... 5 common frames omitted

ligne 25 is: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Notes:

* Java.sécurité sur le serveur 1.6.0.12 java annuaire correspond presque exactement avec le 1.6.0.26 de java.fichier de sécurité. Il n'y a pas des fournisseurs supplémentaires dans le premier.

* La question précédente est ici .

352
demandé sur Kirby 2011-06-26 05:40:15

16 réponses

très probablement vous n'avez pas le fichier illimité de résistance installé maintenant.

Vous pouvez avoir besoin de télécharger ce fichier:

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7 Download

Java Cryptography Extension (JCE) Force Illimitée de la Compétence de la Politique de Fichiers 8 Télécharger

extraire les fichiers jar à partir du zip et les enregistrer dans ${java.home}/jre/lib/security/ .

651
répondu James Black 2016-08-17 10:24:30

les fichiers de juridiction JRE/JDK / Java 8 peuvent être trouvés ici:

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8 Download

comme dit James ci-dessus:

Installez les fichiers dans ${java.home}/jre/lib/security/ .

48
répondu Saad Malik 2014-10-22 05:48:17

pour JAVA 7 le lien de téléchargement est jce-7-download

copier les deux jarres téléchargées en Java\jdk1.7.0_10\jre\lib\security

Prenez une copie de jarres plus anciennes pour être sur le côté plus sûr.

pour JAVA 8 le lien de téléchargement est jce-8-download

Copier les pots téléchargés dans Java\jdk1.8.0_45\jre\lib\security

Prendre une sauvegarde des jarres plus anciennes pour être sur le côté plus sûr.

38
répondu C Deepak 2016-02-23 09:18:26

avec Java 9, Java 8u161 , Java 7u171 et Java 6u181 la limitation est maintenant désactivée par défaut. Voir problème de Bug Java dans la Base de données .


commençant par Java 8u151 vous pouvez désactiver la limitation de manière programmatique.

dans les mises en liberté antérieures, les dossiers de compétence du JCE devaient être téléchargé et installé séparément pour permettre la cryptographie illimitée pour être utilisé par le JDK. Les étapes de téléchargement et d'installation ne sont plus nécessaires.

à la place, vous pouvez maintenant invoquer la ligne suivante avant la première utilisation des classes JCE (c.-à-d. de préférence juste après le début de l'application):

Security.setProperty("crypto.policy", "unlimited");
26
répondu Sebastian S 2018-03-20 10:31:15

il s'agit d'une solution à code unique . Pas besoin de télécharger ou de salir les fichiers de configuration.

C'est une solution basée sur la réflexion, testé sur java 8

appelez cette méthode une fois, au début de votre programme.

//Importations

import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;

//méthode

public static void fixKeyLength() {
    String errorString = "Failed manually overriding key-length permissions.";
    int newMaxKeyLength;
    try {
        if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) {
            Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection");
            Constructor con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissionCollection = con.newInstance();
            Field f = c.getDeclaredField("all_allowed");
            f.setAccessible(true);
            f.setBoolean(allPermissionCollection, true);

            c = Class.forName("javax.crypto.CryptoPermissions");
            con = c.getDeclaredConstructor();
            con.setAccessible(true);
            Object allPermissions = con.newInstance();
            f = c.getDeclaredField("perms");
            f.setAccessible(true);
            ((Map) f.get(allPermissions)).put("*", allPermissionCollection);

            c = Class.forName("javax.crypto.JceSecurityManager");
            f = c.getDeclaredField("defaultPolicy");
            f.setAccessible(true);
            Field mf = Field.class.getDeclaredField("modifiers");
            mf.setAccessible(true);
            mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
            f.set(null, allPermissions);

            newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES");
        }
    } catch (Exception e) {
        throw new RuntimeException(errorString, e);
    }
    if (newMaxKeyLength < 256)
        throw new RuntimeException(errorString); // hack failed
}

Crédits: Delthas

25
répondu Jako 2017-06-01 17:41:45

"Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6"

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

16
répondu evanxsummers 2011-12-22 10:33:06

en Java, par défaut AES prend en charge une clé de 128 bits, si vous prévoyez d'utiliser la clé de 192 bits ou de 256 bits, java complier lancera L'Exception de taille de clé illégale, ce que vous obtenez.

la solution est comme victor & James suggéré, vous aurez besoin de télécharger JCE (Java Cryptography Extension) selon votre version JRE, (java6, java7 ou java8).

le zip JCE contient le pot suivant:

  1. politique locale.jar
  2. US_export_policy.jar

vous devez remplacer ce bocal de votre <JAVA_HOME>/jre/lib/security . si vous êtes sur un système unix le fera probablement référence à /home/urs/usr/lib/jvm/java-<version>-oracle/

remplace parfois la politique locale.jar, US_export_policy.jar dans le dossier de sécurité ne fonctionne pas sur unix, donc je suggère de copier le dossier de sécurité sur votre bureau d'abord, remplacer le dossier @Desktop/security de jar, supprimer le dossier de sécurité de /jre/lib/ & déplacer le Dossier de sécurité du Bureau to/jre/lib/.

eg :: sudo mv de sécurité /usr/lib/jvm/java-7-oracle/jre/lib

16
répondu Ketan Vishwakarma 2017-11-02 17:20:48

j'ai éprouvé la même erreur en utilisant Windows 7 x64, Eclipse, et JDK 1.6.0_30. Dans le dossier d'installation JDK il y a un dossier jre . Cela m'a d'abord déconcerté car j'ajoutais les jarres mentionnées ci-dessus au dossier lib/security de JDK sans succès. Chemin complet:

C:\Program Files\Java\jdk1.6.0_30\jre\lib\security

télécharger et extraire les fichiers contenus dans le dossier jce de cette archive dans ce dossier.

15
répondu anon 2014-08-29 13:46:07

le problème est le contenu du fichier default_local.politique dans local_policy.jar dans le dossier jre\lib\security , si vous installez le JRE:

// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.

grant {
    permission javax.crypto.CryptoPermission "DES", 64;
    permission javax.crypto.CryptoPermission "DESede", *;
    permission javax.crypto.CryptoPermission "RC2", 128,
                                     "javax.crypto.spec.RC2ParameterSpec", 128;
    permission javax.crypto.CryptoPermission "RC4", 128;
    permission javax.crypto.CryptoPermission "RC5", 128,
          "javax.crypto.spec.RC5ParameterSpec", *, 12, *;
    permission javax.crypto.CryptoPermission "RSA", *;
    permission javax.crypto.CryptoPermission *, 128;
};

si vous n'avez pas besoin de paramètres valables dans le monde entier, vous pouvez simplement éditer ce fichier et changer le contenu en

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};

c'est ce que obtenir si vous téléchargez le JCE D'Oracle.

5
répondu max 2015-09-25 20:35:15

il y a une brève discussion de ce qui semble être ce numéro ici . La page liens semble être disparu, mais l'une des réponses pourrait être ce dont vous avez besoin:

en effet, copie US_export_policy.jar et local_policy.pot de core/lib/jce $JAVA_HOME/jre/lib/security aidé. Grâce.

4
répondu RHSeeger 2014-04-28 03:24:35

j'ai également obtenu le problème, mais après avoir remplacé un existant avec le Téléchargé (de JCE) un résolu le problème. Les nouveaux fichiers crypto fournissent une force illimitée.

3
répondu Dev G 2011-12-15 06:44:48

par défaut, Java ne supporte que les tailles de clés AES 128 bits (16 octets) pour le chiffrement. Si vous n'avez pas besoin de plus que la prise en charge par défaut, vous pouvez couper la clé à la bonne taille avant d'utiliser Cipher . Voir javadoc pour les clés supportées par défaut.

il s'agit d'un exemple de génération d'une clé qui fonctionnerait avec n'importe quelle version de JVM sans modifier les fichiers de la Politique. Utilisez à votre propre discrétion.

Voici un bon article sur si les clés 128 à 256 tailles de clés comptent sur AgileBits Blog

SecretKeySpec getKey() {
    final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");
    final sha = MessageDigest.getInstance("SHA-256");

    def key = sha.digest(pass);
    // use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.
    // Updated jvm policies are required for 256 bit.
    key = Arrays.copyOf(key, 16);
    return new SecretKeySpec(key, AES);
}
1
répondu keaplogik 2016-01-15 14:37:26

par défaut JDK prend en charge le cryptage seulement par 128 bits clés à cause des restrictions américaines. Donc, pour prendre en charge le cryptage à partir d'une clé de 256 bits, nous devons remplacer local_policy.jar et US_export_policy.jars dans $JAVA_HOME/java-8-oracle/jre/lib/security dossier sinon il donnera:

de java.sécurité.InvalidKeyException: Taille de clé illégale ou par défaut

les pots et le concept détaillé peuvent être compris à partir du lien:

easybook4u.com

1
répondu Sulabh Jain 2018-03-16 13:02:02

à partir de Java 9 ou 8u151, vous pouvez utiliser une ligne de commentaire dans le fichier:

<JAVA_HOME>/jre/lib/security/java.security

et changement:

#crypto.policy=unlimited

à

crypto.policy=unlimited
1
répondu Ahmed Ashour 2018-03-16 13:04:54

si vous utilisez la distribution Linux avec apt et que vous avez ajouté webupd8 PPA, vous pouvez simplement lancer la commande

apt-get install oracle-java8-unlimited-jce-policy

autres mises à jour:

  1. les fichiers de la Politique de juridiction de force illimitée sont inclus avec Java 9 et utilisés par défaut
  2. commençant par Java 8 Update 161 , Java 8 par défaut à la Politique de la juridiction de force illimitée.
  3. à partir de Java 8 Update 151 , la Politique de juridiction illimitée est incluse avec Java 8 mais n'est pas utilisée par défaut. Pour l'activer, vous devez modifier le java.fichier de sécurité <java_home>/jre/lib/security (pour JDK) ou <java_home>/lib/security (pour JRE). Décommentez (ou incluez) la ligne

    crypto.policy=unlimited

    assurez-vous d'éditer le fichier en utilisant un éditeur administrateur. Le changement de politique ne prend effet qu'après le redémarrage de L'entreprise commune

avant Java 8 Update 151 les autres réponses sont valables. Télécharger JcE Unlimited Strength Policy Files et remplacer.

comment installer Java Cryptography Extension (JCE) unlimited strength jurisdiction policy files

1
répondu Aniket Thakur 2018-07-21 15:54:50

il y a deux options pour résoudre ce problème

option numéro 1: certificat d'utilisation avec moins de longueur RSA 2048

option Numéro 2: vous mettrez à jour deux bocaux dans jre\lib\security tout ce que vous utilisez java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

ou vous utilisez IBM websphere ou n'importe quel serveur d'application qui utilise son java . le problème principal que j'ai rencontré, j'ai utilisé la certification avec la longueur maximale ,quand j'ai déployé des oreilles sur websphere la même exception est lancée

Java Security: Illegal key size or default parameters?

j'ai mis à jour java intsalled folder dans websphere avec deux pots https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

vous pouvez vérifier la référence dans le lien https://www-01.ibm.com/support/docview.wss?uid=swg21663373

0
répondu Shaaban Ebrahim 2018-06-25 10:37:33