Java: Patchen der clientseitigen Sicherheitsrichtlinie aus dem Applet für AES256

Ich benötige AES256-Verschlüsselung / -Entschlüsselung in einer kommerziellen Webanwendung. Derzeit ist mit einer Schlüsselgröße von 128 alles in Ordnung. Dies ist kryptografisch nicht zufriedenstellend. Daher ist mein Problem, wie Sie dieses Problem am besten umgehen können, ohne dass der Benutzer manuell etwas installieren muss.

Ich habe die JAR-Dateien mit unbegrenzter Gerichtsbarkeit von Oracle, aber ich habe keine Ahnung, ob das Ersetzen dieser Dateien im JRE / lib / security-Verzeichnis des Benutzers mit älteren Versionen kompatibel ist. Natürlich möchte ich die JRE des Benutzers nicht beschädigen. Ich habe auch eine Schreibberechtigung für mein JRE-Sicherheitsverzeichnis, aber ich gehe davon aus, dass einige Benutzer nicht über diese Berechtigungen verfügen.

Gibt es einen einfachen Weg, um dieses Problem zu umgehen, oder stecke ich bei einer schwachen Verschlüsselung oder einem potenziell problematischen Schritt für Benutzer fest?

Update für "uneingeschränkt"javax.crypto.JceSecurity

@ntoskml Du bist richtig.getMaxAllowedKeyLength gibt weiterhin die begrenzte Schlüsselgröße zurück, aber die Verschlüsselung ist mit der Schlüsselgröße == 256 erfolgreich :). Ich werde meine Testmethode aktualisieren und die Schlüsselgröße festlegen, wenn eine starke Verschlüsselung verfügbar ist. Vielen Dank

>>> 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])

Und der Testfall nach dem Neustart der Jython-Konsole

>>> # 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 :) Danke, dass du @ntoskml geteilt hast

Antworten auf die Frage(2)

Ihre Antwort auf die Frage