Ik had hier eerder een vraag over gesteld, maar deze werd niet goed beantwoord en leidde nergens toe.
Dus ik heb een paar details over het probleem opgehelderd en ik zou graag uw ideeën horen over hoe ik dit kan oplossen of wat ik moet proberen.
Ik heb Java 1.6.0.12geïnstalleerd op mijn Linux-server en de onderstaande code werkt perfect.
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);
}
Vandaag heb ik Java 1.6.0.26geïnstalleerd op mijn servergebruiker en wanneer ik mijn applicatie probeer uit te voeren, krijg ik de volgende uitzondering. Ik vermoed dat het iets te maken heeft met de Java-installatieconfiguratie, omdat het in de eerste wel werkt, maar niet in de latere versie.
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
Lijn 25is:
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
Opmerkingen:
* Java.Security op server’s 1.6.0.12 Java Directory Matches bijna volledig met de 1.6.0.26 Java.security-bestand. Er zijn geen extra providers in de eerste.
* De vorige vraag is hier .
1, Autoriteit 100%
Hoogstwaarschijnlijk heb je het onbeperkte sterkte-bestand nu niet geïnstalleerd.
Mogelijk moet u dit bestand downloaden:
Java Cryptography Extension (JCE) Onbeperkte kracht Beleidsbestanden van jurisdictie 6
Java Cryptography Extension (JCE) onbeperkte kracht Jurisdictie Beleidsbestanden 7 Download
Java Cryptography Extension (JCE) Unlimited Strength Jurisdial Beleid Bestanden 8 Download (alleen vereist voor versies vóór Java 8 U162)
Pak de jar-bestanden uit de ZIP en sla ze op in ${java.home}/jre/lib/security/
.
2, Autoriteit 8%
De JRE / JDK / JAVA 8 Jurisdictie-bestanden zijn hier te vinden:
Java Cryptography Extension (JCE) Unlimited Strength Jurisdial Beleid Bestanden 8 Download
zoals James zei hierboven:
Installeer de bestanden in ${java.home}/jre/lib/security/
.
3, Autoriteit 6%
Met Java 9, Java 8u161, Java 7u171en Java 6u181de beperking is nu uitgeschakeld door standaard. Zie probleem in Java Bug Database.
Begin met Java 8u151kunt u de beperking programmatisch.
In oudere releases moesten JCE-jurisdictiebestanden afzonderlijk worden gedownload en geïnstalleerd om onbeperkte cryptografie door de JDK mogelijk te maken. De download- en installatiestappen zijn niet langer nodig.
In plaats daarvan kunt u nu de volgende regel aanroepen voor het eerste gebruik van JCE-klassen (d.w.z. bij voorkeur direct na het starten van de toepassing):
Security.setProperty("crypto.policy", "unlimited");
Antwoord 4, autoriteit 6%
Voor JAVA 7 is de downloadlink jce -7-download
Kopieer de twee gedownloade jars in Java\jdk1.7.0_10\jre\lib\security
Neem een back-up van oudere potten om aan de veilige kant te zijn.
Voor JAVA 8 is de downloadlink jce-8 -downloaden
Kopieer de gedownloade jars in Java\jdk1.8.0_45\jre\lib\security
Neem een back-up van oudere potten om op een veiliger kant te staan.
5, Autoriteit 4%
Dit is een oplossing alleen-code . U hoeft niet te downloaden of te rotzooien met configuratiebestanden.
Het is een op reflectie gebaseerde oplossing, getest op Java 8
Bel deze methode eenmaal, vroeg in uw programma.
// importeert
import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;
// Method
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
}
Credits: Delthas
Antwoord 6, autoriteit 2%
In Java ondersteunt AES standaard een 128-bits sleutel. Als u van plan bent een 192-bits of 256-bits sleutel te gebruiken, zal java-complier de uitzondering voor de illegale sleutelgrootte genereren, die u krijgt.
De oplossing is als overwinnaar & James stelde voor dat je JCE (Java Cryptography Extension) moet downloaden volgens je JRE-versie (java6, java7 of java8).
De JCE-zip bevat de volgende JAR:
- local_policy.jar
- US_export_policy.jar
U moet deze jar vervangen door uw <JAVA_HOME>/jre/lib/security
.
als je een Unix-systeem gebruikt, zal het waarschijnlijk verwijzen naar /home/urs/usr/lib/jvm/java-<version>-oracle/
Soms werkt het vervangen van local_policy.jar, US_export_policy.jar in de beveiligingsmap niet op unix, dus ik raad aan om eerst de beveiligingsmap naar uw bureaublad te kopiëren, de map @Desktop/security van de jar te vervangen, de beveiligingsmap te verwijderen uit / jre/lib/ & amp; verplaats de bureaubladbeveiligingsmap naar /jre/lib/.
eg :: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib
Antwoord 7, autoriteit 2%
“Java Cryptography Extension (JCE) Onbeperkte sterkte Jurisdictiebeleidsbestanden 6”
http://www.ORACLE. com / technetwork / java / javase / downloads / jce-6-download-429243.html
8
Er is een korte discussie over wat dit probleem lijkt te zijn hier . De pagina IT Links naar verschijnt weg zijn, maar een van de antwoorden is misschien wat je nodig hebt:
Inderdaad, US_Export_Policy.jar en Local_Policy.jar van Core / Lib / JCE tot $ Java_Home / JRE / LIB / Beveiliging geholpen. Bedankt.
9
Ik kreeg ook het probleem, maar na het vervangen van bestaande met de gedownloade (van JCE), heeft men het probleem opgelost. Nieuwe Crypto-bestanden hebben onbeperkte sterkte gegeven.
10
Standaard ondersteunt JAVA alleen AES 128 bit (16 bytes) -toetsen voor codering. Als u niet meer nodig hebt dan de standaard ondersteund, kunt u de sleutel in de juiste maat intrekken voordat u Cipher
gebruikt. Zie Javadoc voor standaard ondersteunde toetsen.
Dit is een voorbeeld van het genereren van een sleutel die werkt met een JVM-versie zonder de beleidsbestanden aan te passen. Gebruik op eigen goeddunken.
Hier is een goed artikel over de vraag of sleutel 128-256 key maten toe op 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);
}
11
Als u gebruik maakt van Linux-distributie met apt en hebt toegevoegd webupd8 PPA, kunt u gewoon de opdracht uitvoeren
apt-get install oracle-java8-unlimited-jce-policy
Andere updates:
- De Unlimited Strength Bevoegdheid Policy Bestanden worden opgenomen in Java 9 en standaard gebruikt
- Te beginnen met Java 8 bijwerken 161 , Java 8 standaard de Unlimited Strength Bevoegdheid beleid.
-
Te beginnen met Java 8 bijwerken 151 , de Unlimited Strength Bevoegdheid beleid wordt meegeleverd met Java 8, maar niet standaard gebruikt. Om het mogelijk te maken, moet je om het te bewerken java.security bestand in
<java_home>/jre/lib/security
(voor JDK) of<java_home>/lib/security
(voor JRE). Uncomment (of onder) de regelcrypto.policy=unlimited
Zorg ervoor dat u het bestand met een editor als administrator uitvoeren bewerken.
De wijziging van het beleid is pas effectief na het herstarten van de JVM
Voor Java 8 Update 151blijven de rest van de antwoorden geldig. Download JCE Unlimited Strength Jurisdiction Policy Files en vervang.
Voor meer details kun je mijn persoonlijke blogpost hieronder raadplegen:
Hoe Java Cryptography Extension (JCE) onbeperkte jurisdictie te installeren beleidsbestanden
Antwoord 12
Vanaf Java 9 of 8u151 kunt u een regel commentaar geven in het bestand:
<JAVA_HOME>/jre/lib/security/java.security
En wijzigen:
#crypto.policy=unlimited
naar
crypto.policy=unlimited
Antwoord 13
er zijn twee opties om dit probleem op te lossen
optie nummer 1:gebruik certificaat met minder lengte RSA 2048
optie nummer 2:u werkt twee jars bij in jre\lib\security
wat je ook gebruikt java http://www. oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
of u gebruikt IBM websphere of een toepassingsserver die zijn java gebruikt.
het grootste probleem waarmee ik werd geconfronteerd, ik gebruikte certificering met maximale lengte, toen ik oren op websphere gebruikte, werd dezelfde uitzondering gegooid
Java Security: Illegal key size or default parameters?
ik heb de java-geïnstalleerde map in websphere geüpdatet met twee potten
https://www14. software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US
u kunt de referentie controleren in de link https://www-01 .ibm.com/support/docview.wss?uid=swg21663373
Antwoord 14
Zorg ervoor dat u de nieuwste versie van JDK/JREgebruikt.
In mijn geval had ik JCE in de JRE-map geplaatst, maar het hielp niet. Het gebeurde omdat ik mijn project rechtstreeks vanuit de IDE uitvoerde (met JDK).
Vervolgens heb ik mijn JDK en JRE geüpdatet naar de nieuwste versie (1.8.0_211) en het probleem was verdwenen.
Meer details: https://bugs.java.com/ bugdatabase/view_bug.do?bug_id=JDK-8170157
Antwoord 15
Standaard JDK ondersteunt alleen versleuteling via 128-bits sleutels vanwege Amerikaanse beperkingen.
Dus om codering van een 256 bit lange sleutel te ondersteunen, moeten we local_policy.jar
en US_export_policy.jars
vervangen in $JAVA_HOME/java-8-oracle/jre/lib/security
map anders geeft het:
java.security.InvalidKeyException: Illegale sleutelgrootte of standaard
Antwoord 16
Je moet daarheen gaan
/jdk1.8.0_152
| /jre
| /lib
| /veiligheid
| java.beveiliging
en verwijder het commentaar van de
#crypto.policy=unlimited
naar
crypto.policy=unlimited
Antwoord 17
Download de JCE-bestanden van onderstaande link voor Java 6
https://www.oracle.com/java/technologies/jce-6-download.html
Download de JCE-bestanden van onderstaande link voor Java 8
https://www.oracle.com/java/technologies/javase-jce8-downloads.html
Kopieer de bestanden die zijn gedownload van de bovenstaande link en ga naar JDK Installed Directory
/Users/ik/jdk1.8.0_72/jre/lib/security
Plakken & Vervang de bestanden uit de map. Start uw applicatie opnieuw & de fout moet worden opgelost.