InvalidKeyException Illegale keygrootte

Ik heb een test die groot op mijn ontwikkeling MacBook Pro loopt, maar er niet in slaagt om te draaien in continue integratie TeamCity server.

De fout is als volgt:

java.security.InvalidKeyException: Illegal key size
    at javax.crypto.Cipher.a(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)
    at javax.crypto.Cipher.init(DashoA13*..)

Zowel de ontwikkeling doos en TeamCity maakt gebruik van Java 1.6 en ik gebruik BouncyCastle bibliotheek voor de noodzaak van speciale AES-encryptie.

De code is als volgt:

private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException {
    Security.addProvider(new BouncyCastleProvider());
    SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
    cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes()));
    return cipher.doFinal(info.getBytes("UTF-8"));
}

update

Het lijkt erop dat volgens het gekozen antwoord moet ik iets op mijn TeamCity installatie aan te passen en het zal mogelijk invloed op bepaalde gebruiker installaties – dus het is niet een goede keuze die ik heb om over te schakelen naar een andere crypto bibliotheek om dat te doen zonder beperkingen. Dus waarschijnlijk springkasteel zal helpen.

UPDATE 2

Ik heb daadwerkelijk ingeschakeld om Bouncescastle te gebruiken om deze beperking te voorkomen. Merk op dat dit alleen werkt Als u rechtstreeks eigen BC-klassen gebruikt, niet de BC-provider.


Antwoord 1, Autoriteit 100%

Deze fout betekent dat uw JAVA-virtuele machine een beleid gebruikt dat alleen beperkte cryptografie-sleutelgrootte mogelijk maakt vanwege de Amerikaanse uitvoerwetten.

Java 9 en hoger

De Unlimited Strength-jurisdictie-beleidsdossiers zijn bij Java 9 meegeleverd en standaard gebruikt (zie Beveiligingsupdates in de Java 9 Migratiegids ).

Als u deze foutmelding met Java 9 krijgt, kan dit betekenen dat de beleidsconfiguratie is gewijzigd in een meer beperkend beleid (limited), zie de instructies van de migratiegids:

JCE Jurisdictie Beleidsbestandinstellingen is onbeperkt

Als uw aanvraag eerder de Java-cryptografie vereist
Extension (JCE) Onbeperkte kracht Jurisdictie Beleidsbestanden, dan jij
U hoeft ze niet langer te downloaden of te installeren. Ze zijn opgenomen in de
JDK en worden standaard geactiveerd.

Als uw land of gebruik een meer beperkend beleid vereist, de
Beperkte Java Cryptografische beleidsdossiers zijn nog steeds beschikbaar.

Als u vereisten hebt die niet door een van het beleid zijn voldaan
Bestanden die standaard worden verstrekt, kunt u deze beleidsbestanden aanpassen
om aan uw behoeften te voldoen.

Zie de crypto.policybeveiligingseigendom in de
<java-home>/conf/security/java.securitybestand, of
Cryptografische sterkteconfiguratie in het Java-platform,
Standard Edition Security Developer’s Guide.

Java 8 en eerder

Java 8 Update 161 en hoger

Vanaf Java 8 Update 161 is Java 8 standaard ingesteld op het onbeperkte bevoegdheidsbeleid. Als u deze foutmelding krijgt, kan dit erop wijzen dat de configuratie is gewijzigd in limited. Zie instructies in de volgende sectie over Java 8 Update 151 of de vorige sectie over Java 9, om dit terug te veranderen naar unlimited.

Java 8 Update 151 en hoger

Vanaf Java 8 Update 151 is het Unlimited Strength Jurisdiction Policy bij Java 8 inbegrepen, maar wordt het niet standaard gebruikt. Om dit in te schakelen, moet u het bestand java.securitybewerken in <java_home>/jre/lib/security(voor JDK) of <java_home>/lib/security(voor JRE). Maak commentaar op (of voeg toe) aan de regel

crypto.policy=unlimited

Zorg ervoor dat u het bestand bewerkt met een editor die als beheerder wordt uitgevoerd.

De beleidswijziging wordt pas van kracht nadat de JVM opnieuw is opgestart (dit is vooral belangrijk voor langlopende serverprocessen zoals Tomcat).

Voor achterwaartse compatibiliteit werkt het installeren van de beleidsbestanden zoals beschreven in de volgende sectie ook nog steeds.

Vóór Java 8 Update 151

Voor Java 8 Update 144 en eerder moet u de Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files (beschikbaar op Oracle).

Om deze bestanden te installeren (vanaf de README.txtin de download):

  1. Download de onbeperkte sterkte JCE-beleidsbestanden.

  2. Decomprimeer het gedownloade bestand en pak het uit.

    Hierdoor wordt een submap gemaakt met de naam jce.
    Deze map bevat de volgende bestanden:

    README.txt                   This file
    local_policy.jar             Unlimited strength local policy file
    US_export_policy.jar         Unlimited strength US export policy file
    
  3. Installeer de JAR-bestanden van het beleid voor onbeperkte sterkte.

    In het geval u later besluit terug te keren naar de oorspronkelijke “sterke” maar
    beperkte beleidsversies, maak eerst een kopie van de originele JCE
    beleidsbestanden (US_export_policy.jar en local_policy.jar). Vervolgens
    vervang de sterke beleidsbestanden door de onbeperkte sterkte
    versies geëxtraheerd in de vorige stap.

    De standaardplaats voor JCE jurisdictiebeleid JAR-bestanden is:

    <java-home>/lib/security           [Unix]
    <java-home>\lib\security           [Windows]
    

Opmerking voor de JDK staat in jre/lib/security.

Het nieuwe beleidsbestand wordt pas van kracht nadat de JVM opnieuw is opgestart (dit is vooral belangrijk voor langlopende serverprocessen zoals Tomcat).


Antwoord 2, autoriteit 6%

Ik had een soortgelijk probleem, maar in mijn geval was er een padfout.

JAVA_HOME was jdk1.6.0_18, dus ik plaatste de twee jars in jdk1.6.0_18/lib/security, maar binnen jdk1.6.0_18 is de directory jre. Beide bestanden hadden in jdk1.6.0_18/jre/lib/securitymoeten staan.


Antwoord 3

Naast het installeren van beleidsbestanden, moet u er ook voor zorgen dat CUSTOMLONGSECRETKEY...getBytes()inderdaad een array van 32 bytes produceert. Ik zou CUSTOMLONGSECRETKEY.getBytes(some encoding)gebruiken en daaruit de eerste 32 bytes halen. Beter nog, gebruik de hele geheime sleutel om sleutels voor AES af te leiden met de grootte die je nodig hebt.


Antwoord 4

Zorg ervoor dat u het pad naar JAVA_HOME kent dat uw IDE gebruikt.
Om naar het juiste pad te kopiëren.

In mijn geval gebruik ik IntelliJ:
/Bibliotheek/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security

In plaats van wanneer ik $JAVA_HOME in de console laat zien.
/Users/myuser/.sdkman/candidates/java/current/jre/lib/security


Antwoord 5

Ik had hetzelfde probleem voor jdk 1.8.0_151-

Voor deze en hogere versie hoeft u de jar-bestanden met betrekking tot beveiliging niet te downloaden. Omdat local_policy.jar en US_export_policy.jar al in deze versies zijn opgenomen onder het pad-
\jre\lib\security\policy (JAVA_HOME verwijst naar uw huidige Java-installatiemap)
De enige wijziging die u hoeft aan te brengen is in het bestand java.security dat aanwezig is in /jre/lib/security –
verwijder commentaar op de regel –
crypto.policy=onbeperkt

Other episodes