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


Answers

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/ .

Question

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 .







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 <JAVA_HOME>/jre/lib/security . se sei su un sistema Unix probabilmente si riferirà a /home/urs/usr/lib/jvm/java-<version>-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




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



Tags