2013-08-26 93 views
5

我需要在商業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

+0

請不要以這種方式編輯問題 - 目前對於尋找解決方案的人來說,目前有點難以閱讀。我也想知道使用這個答案的限制。通常applet不允許你以這種方式使用反射 - 至少不能在瀏覽器中運行。 –

+0

@owlstead我應該把這個放在哪裏? – drew

+0

此方法適用於運行Windows 8 64位Java™SE運行環境1.7.0_21 – drew

回答

2

您可能是堅持與弱加密的用戶或潛在問題的步驟之後, 如果你堅持SunJCE。

導入AES庫顯然沒有問題,但使用Cipher的實例存在問題。如果您有一個不依賴於JCA的特定軟件,您可以將其重寫爲使用Bouncy Castle的輕量級加密API。

請注意,Bouncy API的許多其他部分都依賴於JCE。與SunJCE相比,輕量級API的使用更加棘手,文檔記錄更少。

Bouncy Castle輕量級API也相當大。它包含許多您不需要的功能。所以它可能對你的applet來說太大了。如果是這樣的話,我會建議你創建一個新的庫,它只包含你在Bouncy Castle需要的特定類。幸運的是,Bouncy城​​堡非常寬鬆地獲得許可。只要您保留版權聲明等,您可以輕鬆將其分離。

+0

BC解決方案是否涉及很多膨脹?作爲一個小程序是有點限制。到目前爲止,我試圖避免它。 – drew

+0

你認爲這個功能是否意味着在[bouncycastle最新版本](http://www.bouncycastle.org/latest_releases.html)中的「提供者和輕量級API的JCE」?作爲zip約7.7兆。它旁邊的「輕量級API」是一個6.6梅格拉鍊。我只是在思考多少額外的字節對於小程序用戶意味着什麼。順便說一句 - 關於問題(好,更近)..這個小程序到底做了什麼?爲什麼強大的(?)加密? –

+0

我想要在瀏覽器上下文中的會話之間加密和存儲PKCS#12密鑰存儲區密碼。密鑰存儲區訪問用於簽名上傳和解密下載的令牌(單獨的功能)。否則,用戶可能需要重複輸入他們的密碼。 – drew