Richiesto crittografia/decrittografia AES256 in un'applicazione web commerciale. Attualmente tutto funziona bene con una dimensione della chiave di 128. Questo non è soddisfacente crittograficamente, quindi il mio problema è il modo migliore per aggirare questo problema senza richiedere all'utente di installare nulla manualmente.Java: applicazione dei criteri di protezione lato client dall'applet per AES256
Ho i file jar di giurisdizione illimitati da Oracle ma non ho idea se la sostituzione di questi nella directory JRE/lib/security dell'utente sia compatibile con le versioni precedenti. Ovviamente non voglio danneggiare il JRE dell'utente. Inoltre ho il permesso di scrittura sulla mia directory di sicurezza JRE ma presumo che alcuni utenti non abbiano questi privilegi.
C'è un modo semplice per risolvere questo problema o sono bloccato con una crittografia debole o un passaggio potenzialmente problematico per gli utenti?
Aggiornamento per "unrestricting" javax.crypto.JceSecurity
@ntoskml Lei ha ragione. getMaxAllowedKeyLength restituisce comunque la dimensione della chiave limitata ma la crittografia ha esito positivo con la dimensione della chiave == 256 :). Aggiornerò il mio metodo di prova e imposto le dimensioni della chiave se è disponibile una crittografia avanzata. Grazie
>>> from javax.crypto import Cipher
>>> Cipher.getMaxAllowedKeyLength("AES")
128
>>> from java.lang import Class
>>> c = Class.forName("javax.crypto.JceSecurity")
>>> isRestricted = c.getDeclaredField("isRestricted")
>>> isRestricted.setAccessible(True)
>>> isRestricted.set(None, False)
>>> isRestricted.get(None)
False
>>> Cipher.getMaxAllowedKeyLength("AES")
128
>>> from javax.crypto import KeyGenerator
>>> kge = KeyGenerator.getInstance("AES")
>>> kge.init(256)
>>> aesKey = kgen.generateKey()
>>> c2 = Cipher.getInstance("AES")
>>> c2.init(Cipher.ENCRYPT_MODE, aesKey)
>>> c2.doFinal("test")
array('b', [-81, 99, -61, -51, 93, -42, -68, -28, 107, 59, -109, -98, -25, 127, 37, 23])
E il banco di prova dopo il riavvio della console Jython
>>> # Reflection as above
>>> isRestricted.get(None)
True
>>> kge.init(256)
>>> aesKey = kge.generateKey()
>>> c2.init(Cipher.ENCRYPT_MODE, aesKey)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1011)
at javax.crypto.Cipher.implInit(Cipher.java:786)
at javax.crypto.Cipher.chooseProvider(Cipher.java:849)
at javax.crypto.Cipher.init(Cipher.java:1213)
at javax.crypto.Cipher.init(Cipher.java:1153)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
java.security.InvalidKeyException: java.security.InvalidKeyException: Illegal key size or default parameters
Bingo :) Grazie per la condivisione @ntoskml
Si prega di non modificare la domanda in questo modo - attualmente è un po 'difficile da leggere per le persone in cerca di una soluzione. Mi piacerebbe anche conoscere le restrizioni sull'utilizzo di questa risposta. Normalmente le applet non consentono di utilizzare i riflessi in questo modo, almeno non quando vengono eseguite nel browser. –
@owlstead Dove dovrei metterlo? – drew
Questo metodo funziona in applet con Windows 8 a 64 bit Java (TM) SE Runtime Environment 1.7.0_21 – drew