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 .
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
extraire les fichiers jar à partir du zip et les enregistrer dans ${java.home}/jre/lib/security/
.
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/
.
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.
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");
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
"Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6"
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
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:
- politique locale.jar
- 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
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.
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.
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.
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.
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);
}
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:
à 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
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:
- les fichiers de la Politique de juridiction de force illimitée sont inclus avec Java 9 et utilisés par défaut
- commençant par Java 8 Update 161 , Java 8 par défaut à la Politique de la juridiction de force illimitée.
-
à 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 lignecrypto.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
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