Java-beveiliging: illegale sleutelgrootte of standaardparameters?

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:

  1. local_policy.jar
  2. 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 Ciphergebruikt. 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:

  1. De Unlimited Strength Bevoegdheid Policy Bestanden worden opgenomen in Java 9 en standaard gebruikt
  2. Te beginnen met Java 8 bijwerken 161 , Java 8 standaard de Unlimited Strength Bevoegdheid beleid.
  3. 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 regel

    crypto.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.jaren US_export_policy.jarsvervangen in $JAVA_HOME/java-8-oracle/jre/lib/securitymap 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.

Other episodes