web-dev-qa-db-fra.com

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 cela n'a pas été répondu correctement et n'a mené nulle part.

J'ai donc clarifié quelques détails sur le problème et j'aimerais vraiment connaître vos idées sur la façon dont je pourrais résoudre ce problème ou que devrais-je essayer? 

Java 1.6.0.12 est 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 utilisateur de serveur et lorsque j'essaie d'exécuter mon application, j'obtiens l'exception suivante. J'imagine que cela a quelque chose à voir avec la configuration de l'installation Java, car cela fonctionne dans la première, mais pas dans la dernière version.

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 est: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Remarques:
* Java.security du répertoire Java 1.6.0.12 du serveur correspond presque complètement au fichier 1.6.0.26 Java.security. Il n'y a pas de fournisseur supplémentaire dans le premier.
* La question précédente est ici .

368
Rihards

Très probablement, le fichier de force illimitée n'est pas installé maintenant.

Vous devrez peut-être télécharger ce fichier:

JCE (Java Cryptography Extension) - Fichiers de règles de juridiction à compétence illimitée 6

JCE (Java Cryptography Extension) - Fichiers de stratégie juridictionnelle à portée illimitée 7 téléchargés

Téléchargement illimité de fichiers de règles de compétence juridictionnelle JCE (JCE) (requis uniquement pour les versions antérieures à Java 8 u162)

Extrayez les fichiers JAR du fichier Zip et enregistrez-les dans ${Java.home}/jre/lib/security/.

677
James Black

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

JCE (Java Cryptography Extension) - Fichiers de règles de juridiction de force illimitée 8 Téléchargement

Comme James a dit ci-dessus:
Installez les fichiers dans ${Java.home}/jre/lib/security/.

49
Saad Malik

Pour Java 7, le lien de téléchargement est jce-7-download

Copiez les deux fichiers JAR téléchargés dans Java\jdk1.7.0_10\jre\lib\security
Faites une copie de sauvegarde des anciens pots afin d’être plus sûr. 

Pour Java 8, le lien de téléchargement est jce-8-download
Copiez les fichiers jar téléchargés dans Java\jdk1.8.0_45\jre\lib\security
Faites une copie de sauvegarde des anciens pots afin d’être plus sûr. 

38
C Deepak

Avec Java 9, Java 8u161 , Java 7u171 et Java 6u181 , la limitation est maintenant désactivée par défaut. Voir issue dans la base de données de bogues Java .


À partir de Java 8u151 , vous pouvez désactiver la limitation par programmation.

Dans les versions précédentes, les fichiers de juridiction JCE devaient être téléchargés et installés séparément pour permettre au JDK d'utiliser une cryptographie illimitée. Les étapes de téléchargement et d'installation ne sont plus nécessaires.

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

Security.setProperty("crypto.policy", "unlimited");
27
Sebastian S

Ceci est une solution code uniquement. Pas besoin de télécharger ou de jouer avec les fichiers de configuration. 

C'est une solution basée sur la réflexion, testée 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

26
Jako

En Java, par défaut, AES prend en charge une clé 128 bits. Si vous envisagez d’utiliser une clé 192 bits ou 256 bits, le fournisseur Java lève une exception illégale de taille de clé que vous obtenez.

Comme Victor et James l’ont suggéré, vous devrez télécharger JCE (Java Cryptography Extension) conformément à votre version de JRE (Java6, Java7 ou Java8).

JCE Zip contient les fichiers JAR suivants:

  1. politique_local.jar
  2. US_export_policy.jar

Vous devez remplacer ces pots par votre <Java_HOME>/jre/lib/security. si vous êtes sur un système unix, il sera probablement fait référence à /home/urs/usr/lib/jvm/Java-<version>-Oracle/

Parfois, le simple remplacement du fichier local_policy.jar, US_export_policy.jar dans le dossier de sécurité ne fonctionne pas sous unix. Je suggère donc de copier le dossier de sécurité sur votre bureau d’abord, remplacez le dossier @ Desktop/security du jar, supprimez le dossier de sécurité de/jre/lib/& déplacez le dossier de sécurité du bureau vers/jre/lib /.

par exemple :: Sudo mv security /usr/lib/jvm/Java-7-Oracle/jre/lib

16
Ketan Vishwakarma

"Fichiers de règles de juridiction de force illimitée JCE (Java Cryptography Extension) 6"

http://www.Oracle.com/technetwork/Java/javase/downloads/jce-6-download-429243.html

16
evanxsummers

J'ai rencontré la même erreur lorsque j'utilisais Windows 7 x64, Eclipse et JDK 1.6.0_30. Le dossier d'installation du JDK contient un dossier jre. Cela m'a jeté au début, alors que j'ajoutais les jars susmentionnés au dossier lib/security du JDK sans succès. Chemin complet:

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

Téléchargez et extrayez les fichiers contenus dans le dossier jce de this archive dans ce dossier.

15
anon

le problème est le contenu du fichier default_local.policy in 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 valides 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;
};

voici ce que vous obtiendrez si vous téléchargez le JCE d’Oracle.

5
max

Il y a une brève discussion sur ce qui semble être ce problème ici . La page à laquelle il liens vers semble avoir disparu, mais l'une des réponses pourrait être ce dont vous avez besoin:

En effet, copier US_export_policy.jar et local_policy.jar de core/lib/jce vers $ Java_HOME/jre/lib/security a été d'une grande aide. Merci.

5
RHSeeger

J'ai également eu le problème, mais après avoir remplacé celui existant par celui téléchargé (de JCE), le problème a été résolu. Les nouveaux fichiers cryptographiques ont fourni une force illimitée.

4
Dev G

Par défaut, Java ne prend en charge que les tailles de clé AES 128 bits (16 octets) pour le cryptage. Si vous n'avez pas besoin de plus que la prise en charge par défaut, vous pouvez ajuster la clé à la taille appropriée avant d'utiliser Cipher. Voir javadoc pour les clés prises en charge par défaut.

Ceci est un exemple de génération d'une clé qui fonctionnerait avec n'importe quelle version de JVM sans modifier les fichiers de règles. Utilisez à votre discrétion.

Voici un bon article sur la question de savoir si les tailles de clé comprises entre 128 et 256 sont importantes 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);
}
2
keaplogik

Si vous utilisez la distribution Linux avec apt et que vous avez ajouté webupd8 PPA, vous pouvez simplement exécuter la commande 

apt-get install Oracle-Java8-unlimited-jce-policy

Autres mises à jour:

  1. Les fichiers de stratégie juridictionnelle à portée illimitée sont inclus avec Java 9 et sont utilisés par défaut.
  2. À partir de Java 8 Update 161, Java 8 utilise par défaut la stratégie de juridiction à compétence illimitée.
  3. À partir de Java 8 Update 151, la stratégie de pays à compétence illimitée est incluse dans Java 8 mais n'est pas utilisée par défaut. Pour l'activer, vous devez modifier le fichier Java.security dans <Java_home>/jre/lib/security (pour JDK) ou <Java_home>/lib/security (pour JRE). Décommentez (ou incluez) la ligne

    crypto.policy=unlimited

    Veillez à modifier le fichier à l'aide d'un éditeur exécuté en tant qu'administrateur . 

Avant Java 8 Update 151 le reste des réponses est valide. Téléchargez les fichiers de stratégie juridictionnelle de force illimitée JCE et remplacez-les.

Pour plus de détails, vous pouvez vous reporter à l'article de blog personnel ci-dessous - Comment installer des fichiers de stratégie de compétence illimitée de JCE (JCE)

1
Aniket Thakur

Le JDK par défaut ne prend en charge le cryptage que par le biais de clés 128 bits en raison de restrictions américaines . Ainsi, pour prendre en charge le cryptage à partir d'une clé longue de 256 bits, nous devons remplacer local_policy.jar et US_export_policy.jars dans le dossier $Java_HOME/Java-8-Oracle/jre/lib/security, sans quoi:

Java.security.InvalidKeyException: taille de clé illégale ou valeur par défaut

Vous pouvez comprendre le concept détaillé et les bocaux à partir du lien:

easybook4u.com

1
Sulabh Jain

À partir de Java 9 ou 8u151, vous pouvez utiliser commenter une ligne du fichier:

<Java_HOME>/jre/lib/security/Java.security

Et changer:

#crypto.policy=unlimited

à

crypto.policy=unlimited
1
Ahmed Ashour

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

option numéro 1: utiliser un certificat de longueur moindre RSA 2048

option numéro 2: vous mettrez à jour deux fichiers JAR avec le jre\lib\security.__, quel que soit votre usage de Java http://www.Oracle.com/technetwork/Java/javase/downloads/jce-6-download-429243. html

ou vous utilisez IBM Websphere ou tout serveur d’applications utilisant Java .. Le principal problème auquel j’ai été confronté j’ai utilisé la certification avec une longueur maximale. Lorsque j’ai déployé des oreilles sur Websphere, la même exception est levée. 

Java Security: Illegal key size or default parameters?

j'ai mis à jour le dossier intsalled Java dans Websphere avec deux bocaux 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 link https://www-01.ibm.com/support/docview.wss?uid=swg21663373

1
Shaaban Ebrahim

Assurez-vous d’utiliser la dernière version de JDK/JRE .

Dans mon cas, j'avais mis JCE dans le dossier JRE, mais cela n'a pas aidé. C'est arrivé parce que j'exécutais mon projet directement à partir de IDE (à l'aide de JDK).

Ensuite, j'ai mis à jour mon kit JDK et JRE avec la dernière version (1.8.0_211) et le problème avait disparu.

Plus de détails: https://bugs.Java.com/bugdatabase/view_bug.do?bug_id=JDK-8170157

0
Ruslan Sheremet

Il faut y aller 

/jdk1.8.0_152 | /jre | /lib | /Sécurité | Java.security Et décommentez le

#crypto.policy=unlimited

à

crypto.policy=unlimited
0
Fzum