我需要在商业 Web 应用程序中使用 AES256 加密/解密。目前一切都很好,密钥大小为 128。这在密码学上并不令人满意,所以我的问题是如何最好地解决这个问题,而不需要用户手动安装任何东西。
我有来自 Oracle 的无限制权限 jar 文件,但我不知道在用户的 JRE/lib/security 目录中替换这些文件是否与旧版本兼容。显然我不想破坏用户的 JRE。此外,我对我的 JRE 安全目录具有写权限,但我假设某些用户将没有这些权限。
是否有解决此问题的简单方法,或者我是否坚持使用弱加密或用户可能存在问题的步骤?
“无限制” 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