我需要在商業Web應用程序中使用AES256加密/解密。 目前一切都很好,密鑰大小爲128.這是不令人滿意的加密,所以我的問題是如何最好地解決這個問題,而不需要用戶手動安裝任何東西。Java:針對AES256從applet修補客戶端安全策略
我有從Oracle不受限制的管理jar文件,但我不知道如果替換這些用戶的JRE/lib /安全目錄中將與舊版本兼容。顯然我不想破壞用戶的JRE。此外,我已經向我的JRE安全目錄寫入權限,但我認爲某些用戶不具備這些權限。
有沒有簡單的方法解決這個問題,或者我堅持使用弱加密還是對用戶有潛在問題的步驟?
更新 「unrestricting」 javax.crypto.JceSecurity
@ntoskml你是正確的。 getMaxAllowedKeyLength仍然返回有限的密鑰大小,但加密成功與密鑰大小== 256 :)。我將更新我的測試方法並設置密鑰大小,如果有強大的加密可用。由於
>>> 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])
和測試用例重新啓動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
賓果:)感謝分享@ntoskml
請不要以這種方式編輯問題 - 目前對於尋找解決方案的人來說,目前有點難以閱讀。我也想知道使用這個答案的限制。通常applet不允許你以這種方式使用反射 - 至少不能在瀏覽器中運行。 –
@owlstead我應該把這個放在哪裏? – drew
此方法適用於運行Windows 8 64位Java™SE運行環境1.7.0_21 – drew