Sicurezza Java: dimensione della chiave non valida o parametri predefiniti?

Avevo fatto una domanda su questo prima, ma non ho avuto risposta giusta e non ho portato da nessuna parte.

Quindi ho chiarito alcuni dettagli sul problema e mi piacerebbe davvero sentire le tue idee su come potrei risolvere questo o cosa dovrei provare.

Ho Java 1.6.0.12 installato sul mio server Linux e il codice qui sotto funziona perfettamente.

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); } 

Oggi ho installato Java 1.6.0.26 sul mio utente del server e quando provo a eseguire la mia applicazione, ottengo la seguente eccezione. La mia ipotesi sarebbe che ha qualcosa a che fare con la configurazione dell’installazione Java perché funziona nel primo, ma non funziona nella versione successiva.

 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 

La riga 25 è: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Gli appunti:
* java.security sulla directory java del server 1.6.0.12 corrisponde quasi completamente al file java.security 1.6.0.26 . Non ci sono fornitori aggiuntivi nel primo.
* La domanda precedente è qui .

Molto probabilmente non hai il file di forza illimitato installato ora.

Potrebbe essere necessario scaricare questo file:

Java Cryptography Extension (JCE) File di criteri di giurisdizione di forza illimitata 6

Java Cryptography Extension (JCE) File di criteri di giurisdizione di forza illimitata 7 Download

Java Cryptography Extension (JCE) File di criteri di giurisdizione di forza illimitata 8 Download

Estrai i file jar dallo zip e ${java.home}/jre/lib/security/ in ${java.home}/jre/lib/security/ .

I file di giurisdizione JRE / JDK / Java 8 possono essere trovati qui:

Java Cryptography Extension (JCE) File di criteri di giurisdizione di forza illimitata 8 Download

Come James ha detto sopra:
Installa i file in ${java.home}/jre/lib/security/ .

Per JAVA 7 il collegamento per il download è jce-7-download

Copia i due jar scaricati in Java \ jdk1.7.0_10 \ jre \ lib \ security
Fai un backup dei vasi più vecchi per essere sul lato più sicuro.

Per JAVA 8 il collegamento per il download è jce-8-download
Copia i barattoli scaricati in Java \ jdk1.8.0_45 \ jre \ lib \ security
Fai un backup dei vasi più vecchi per essere sul lato più sicuro.

Questa è una soluzione solo codice . Non c’è bisogno di scaricare o pasticciare con i file di configurazione.

È una soluzione basata su riflessione, testata su java 8

Chiama questo metodo una volta, all’inizio del tuo programma.

// Importazioni

 import javax.crypto.Cipher; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Map; 

//metodo

 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 } 

Crediti: Delthas

Con Java 9, Java 8u161 , Java 7u171 e Java 6u181 la limitazione è ora disabilitata di default. Vedi il problema nel database dei bug di Java .


A partire da Java 8u151 è ansible disabilitare la limitazione a livello di codice .

Nelle versioni precedenti, i file di giurisdizione JCE dovevano essere scaricati e installati separatamente per consentire l’uso illimitato della crittografia da parte del JDK. I passaggi per il download e l’installazione non sono più necessari.

Invece puoi ora richiamare la seguente riga prima del primo utilizzo delle classi JCE (cioè preferibilmente subito dopo l’avvio dell’applicazione):

 Security.setProperty("crypto.policy", "unlimited"); 

File di criteri relativi alla giurisdizione della forza illimitata di Java Cryptography Extension (JCE) 6 ”

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

In Java, per impostazione predefinita, AES supporta una chiave da 128 bit, se si prevede di utilizzare la chiave 192 bit o 256 bit, il compilatore java genererà la dimensione della chiave non valida Eccezione, che si sta ottenendo.

La soluzione è come Victor e James hanno suggerito, sarà necessario scaricare JCE (Java Cryptography Extension) secondo la versione di JRE, (java6, java7 o java8).

Lo zip JCE contiene i seguenti JAR:

  1. local_policy.jar
  2. US_export_policy.jar

Devi sostituire questi jar nella tua /jre/lib/security . se sei su un sistema Unix probabilmente si riferirà a /home/urs/usr/lib/jvm/java--oracle/

A volte basta sostituire local_policy.jar, US_export_policy.jar nella cartella di sicurezza non funziona su unix, quindi consiglio di copiare prima la cartella di sicurezza sul desktop, sostituire la cartella @ Desktop / security del jar, eliminare la cartella di sicurezza da / jre / lib / e sposta la cartella di sicurezza del desktop in / jre / lib /.

es .: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib

Ho riscontrato lo stesso errore durante l’utilizzo di Windows 7 x64, Eclipse e JDK 1.6.0_30. Nella cartella di installazione di JDK c’è una cartella jre . In un primo momento questo mi ha buttato fuori dal momento che aggiungevo i vasetti sopra citati alla cartella lib / security del JDK senza fortuna. Percorso completo:

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

Scarica ed estrai i file contenuti nella cartella jce di questo archivio in quella cartella.

il problema è il contenuto del file default_local.policy in local_policy.jar nella cartella jre \ lib \ security , se si installa 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; }; 

se non hai bisogno di impostazioni valide in tutto il mondo, puoi semplicemente modificare questo file e modificarne il contenuto

 // Country-specific policy file for countries with no limits on crypto strength. grant { // There is no restriction to any algorithms. permission javax.crypto.CryptoAllPermission; }; 

questo è ciò che ottieni se scarichi JCE da Oracle.

C’è una breve discussione su ciò che sembra essere questo problema qui . La pagina a cui rimanda sembra sparita, ma una delle risposte potrebbe essere ciò di cui hai bisogno:

In effetti, è stato ansible copiare US_export_policy.jar e local_policy.jar da core / lib / jce a $ JAVA_HOME / jre / lib / security. Grazie.

Ho anche avuto il problema ma dopo aver sostituito quello esistente con il scaricato (da JCE) si è risolto il problema. I nuovi file crittografici fornivano una forza illimitata.

Per impostazione predefinita, Java supporta solo le dimensioni delle chiavi AES a 128 bit (16 byte) per la crittografia. Se non hai bisogno di più di quello predefinito supportato, puoi tagliare la chiave alla giusta dimensione prima di usare Cipher . Vedi javadoc per le chiavi supportate predefinite.

Questo è un esempio di generazione di una chiave che potrebbe funzionare con qualsiasi versione di JVM senza modificare i file di criteri. Usalo a tua discrezione.

Ecco un buon articolo sull’importanza delle chiavi da 128 a 256 dimensioni chiave sul blog AgileBits

 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); } 

JDK predefinito supporta la crittografia solo tramite chiavi a 128 bit a causa di restrizioni americane. Quindi, per supportare la crittografia da una chiave lunga a 256 bit, dobbiamo sostituire local_policy.jar e US_export_policy.jars nella US_export_policy.jars $JAVA_HOME/java-8-oracle/jre/lib/security altrimenti darà:

java.security.InvalidKeyException: dimensione della chiave non valida o predefinita

Entrambi i barattoli e il concetto dettagliato possono essere compresi dal link:

easybook4u.com

A partire da Java 9 o 8u151, puoi utilizzare il commento di una riga nel file:

 /jre/lib/security/java.security 

E cambia:

 #crypto.policy=unlimited 

a

 crypto.policy=unlimited 

Se si sta utilizzando la distribuzione Linux con apt e si è aggiunto PPA di webupd8, è sufficiente eseguire il comando

 apt-get install oracle-java8-unlimited-jce-policy 

Altri aggiornamenti:

  1. I file dei criteri di giurisdizione sulla forza illimitata sono inclusi in Java 9 e utilizzati per impostazione predefinita
  2. A partire dall’aggiornamento 161 di Java 8, Java 8 fa riferimento alla politica di giurisdizione sulla forza illimitata.
  3. A partire dall’aggiornamento 151 di Java 8 , il criterio di giurisdizione sulla forza illimitata è incluso in Java 8 ma non utilizzato per impostazione predefinita. Per abilitarlo, è necessario modificare il file java.security in /jre/lib/security (per JDK) o /lib/security (per JRE). Decommentare (o includere) la linea

    crypto.policy=unlimited

    Assicurati di modificare il file utilizzando un editor eseguito come amministratore. La modifica della politica ha effetto solo dopo il riavvio della JVM

Prima di Java 8 Update 151 il resto delle risposte è valido. Scarica i file di politica giurisdizionale sulla forza di JCE Unlimited e sostituisci.

Come installare i file di criteri di giurisdizione di forza illimitata di Java Cryptography Extension (JCE)

ci sono due opzioni per risolvere questo problema

opzione numero 1: utilizzare il certificato con una lunghezza minore RSA 2048

opzione numero 2: aggiornerai due jar in jre\lib\security qualunque sia l’uso di java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

oppure si utilizza IBM websphere o qualsiasi application server che utilizza java. il problema principale che ho affrontato ho usato la certificazione con la massima lunghezza, quando ho distribuito le orecchie su websphere è stata lanciata la stessa eccezione

 Java Security: Illegal key size or default parameters? 

Ho aggiornato la cartella java intsalled in websphere con due jar https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

puoi controllare il riferimento nel link https://www-01.ibm.com/support/docview.wss?uid=swg21663373