Ich benötige AES256 Verschlüsselung/Entschlüsselung in einer kommerziellen Webanwendung. Gegenwärtig ist alles mit einer Schlüsselgröße von 128 gut. Das ist kryptographisch nicht befriedigend, also ist mein Problem, wie man dieses Problem am besten umgehen kann, ohne dass der Benutzer irgendetwas manuell installieren muss.Java: Patchen der clientseitigen Sicherheitsrichtlinie aus Applet für AES256
Ich habe die JAR-Dateien mit unbegrenzter Zuständigkeit von Oracle, aber ich habe keine Ahnung, ob das Ersetzen dieser im JRE/lib/security-Verzeichnis des Benutzers mit älteren Versionen kompatibel ist. Offensichtlich möchte ich die JRE des Benutzers nicht beschädigen. Ich habe auch eine Schreibberechtigung für mein JRE-Sicherheitsverzeichnis, aber ich nehme an, dass einige Benutzer diese Rechte nicht haben.
Gibt es einen einfachen Weg um dieses Problem, oder bin ich entweder mit schwachen Verschlüsselung oder einem potenziell problematischen Schritt für Benutzer fest?
Update für "unrestricting" javax.crypto.JceSecurity
@ntoskml Sie richtig sind. getMaxAllowedKeyLength gibt immer noch die begrenzte Schlüsselgröße zurück, aber die Verschlüsselung ist erfolgreich mit der Schlüsselgröße == 256 :). Ich werde meine Testmethode aktualisieren und die Schlüsselgröße festlegen, wenn eine starke Verschlüsselung verfügbar ist. 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
Jython-Konsole neu starten>>> # 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 :) Vielen Dank für die gemeinsame Nutzung @ntoskml
Bitte die Frage nicht auf diese Weise bearbeiten - zur Zeit es ist ein bisschen schwer für Menschen zu lesen für eine Lösung suchen. Ich möchte auch die Einschränkungen bei der Verwendung dieser Antwort wissen. Normalerweise erlauben es Applets nicht, Reflexionen auf diese Weise zu verwenden - zumindest nicht, wenn sie im Browser ausgeführt werden. –
@owlstead Wo soll ich das hinstellen? – drew
Diese Methode in Applet arbeitet Windows 8 mit 64-Bit-Java (TM) SE Runtime Environment 1.7.0_21 – drew