我之前曾问过一个关于这个问题的问题,但它没有得到正确的答案而且无处可去.
所以我已经澄清了关于这个问题的一些细节,我真的很想听听你如何解决这个问题或者我应该尝试什么的想法.
我在我的Linux服务器上安装了Java 1.6.0.12,下面的代码运行得非常完美.
String key = "av45k1pfb024xa3bl359vsb4esortvks74sksr5oy4s5serondry84jsrryuhsr5ys49y5seri5shrdliheuirdygliurguiy5ru";
try {
Cipher c = Cipher.getInstance("ARCFOUR");
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "ARCFOUR");
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
return new String(c.doFinal(Hex.decodeHex(data.toCharArray())), "UTF-8");
} catch (InvalidKeyException e) {
throw new CryptoException(e);
}
Run Code Online (Sandbox Code Playgroud)
今天我在我的服务器用户上安装了Java 1.6.0.26,当我尝试运行我的应用程序时,我得到以下异常.我的猜测是它与Java安装配置有关,因为它在第一个工作,但在更高版本中不起作用.
Caused by: java.security.InvalidKeyException: Illegal key size or default parameters
at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.a(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
at javax.crypto.Cipher.init(DashoA13*..) ~[na:1.6]
at my.package.Something.decode(RC4Decoder.java:25) ~[my.package.jar:na]
... 5 common frames omitted
Run Code Online (Sandbox Code Playgroud)
第25行是:
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
注意:
*服务器的1.6.0.12 java目录中的java.security 几乎完全匹配1.6.0.26 java.security文件.第一个没有其他提供者.
*上一个问题在这里.
Jam*_*ack 712
您很可能现在没有安装无限强度文件.
您可能需要下载此文件:
Java密码术扩展(JCE)无限强度管辖权政策文件8下载(仅适用于Java 8 u162之前的版本)
从zip中提取jar文件并将其保存${java.home}/jre/lib/security/.
Saa*_*lik 52
可以在此处找到JRE/JDK/Java 8管辖区文件:
就像詹姆斯上面所说:
安装文件${java.home}/jre/lib/security/.
C D*_*pak 41
对于JAVA 7,下载链接是jce-7-download
复制Java\jdk1.7.0_10\jre\lib\security中的两个下载的jar
将较旧的jar备份放在更安全的一侧.
对于JAVA 8,下载链接是jce-8-download
复制下载的Java中的jars\jdk1.8.0_45\jre\lib\security
将较旧的jar备份放在更安全的一侧.
Seb*_*n S 35
对于Java 9,Java 8u161,Java 7u171和Java 6u181,默认情况下现在禁用此限制.请参阅Java Bug数据库中的问题.
从Java 8u151开始,您可以以编程方式禁用限制.
在旧版本中,必须单独下载和安装JCE管辖区文件,以允许JDK使用无限制的加密.不再需要下载和安装步骤.
相反,您现在可以在首次使用JCE类之前调用以下行(即最好在应用程序启动后立即调用):
Security.setProperty("crypto.policy", "unlimited");
Run Code Online (Sandbox Code Playgroud)
Jak*_*ako 30
这是一个仅限代码的解决方案.无需下载或搞乱配置文件.
这是一个基于反射的解决方案,在java 8上进行了测试
在程序的早期调用此方法一次.
//进口
import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;
Run Code Online (Sandbox Code Playgroud)
//方法
public static void fixKeyLength() {
String errorString = "Failed manually overriding key-length permissions.";
int newMaxKeyLength;
try {
if ((newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES")) < 256) {
Class c = Class.forName("javax.crypto.CryptoAllPermissionCollection");
Constructor con = c.getDeclaredConstructor();
con.setAccessible(true);
Object allPermissionCollection = con.newInstance();
Field f = c.getDeclaredField("all_allowed");
f.setAccessible(true);
f.setBoolean(allPermissionCollection, true);
c = Class.forName("javax.crypto.CryptoPermissions");
con = c.getDeclaredConstructor();
con.setAccessible(true);
Object allPermissions = con.newInstance();
f = c.getDeclaredField("perms");
f.setAccessible(true);
((Map) f.get(allPermissions)).put("*", allPermissionCollection);
c = Class.forName("javax.crypto.JceSecurityManager");
f = c.getDeclaredField("defaultPolicy");
f.setAccessible(true);
Field mf = Field.class.getDeclaredField("modifiers");
mf.setAccessible(true);
mf.setInt(f, f.getModifiers() & ~Modifier.FINAL);
f.set(null, allPermissions);
newMaxKeyLength = Cipher.getMaxAllowedKeyLength("AES");
}
} catch (Exception e) {
throw new RuntimeException(errorString, e);
}
if (newMaxKeyLength < 256)
throw new RuntimeException(errorString); // hack failed
}
Run Code Online (Sandbox Code Playgroud)
致谢:Delthas
小智 16
"Java密码学扩展(JCE)无限强度管辖政策文件6"
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
ano*_*non 16
使用Windows 7 x64,Eclipse和JDK 1.6.0_30时遇到了同样的错误.在JDK安装文件夹中有一个jre文件夹.当我将上述罐子添加到JDK的lib/security文件夹中时,这让我一开始就没有运气.完整路径:
C:\Program Files\Java\jdk1.6.0_30\jre\lib\security
Run Code Online (Sandbox Code Playgroud)
将此存档jce文件夹中包含的文件下载并解压缩到该文件夹中.
小智 16
在Java中,默认情况下AES支持128位密钥,如果您计划使用192位或256位密钥,则java编译器将抛出非法密钥大小异常,您将获得该密钥.
解决方案是胜利者和詹姆斯建议的,你需要根据你的JRE版本(java6,java7或java8)下载JCE(Java Cryptography Extension).
JCE zip包含以下JAR:
你需要更换这些罐子<JAVA_HOME>/jre/lib/security.如果你在unix系统上,可能会参考/home/urs/usr/lib/jvm/java-<version>-oracle/
有时只是替换local_policy.jar,安全文件夹中的US_export_policy.jar在unix上不起作用,所以我建议先将安全文件夹复制到桌面,替换jar的@ Desktop/security文件夹,从/ jre/lib中删除安全文件夹/&将Desktop安全性文件夹移动到/ jre/lib /.
例如:: sudo mv security /usr/lib/jvm/java-7-oracle/jre/lib
如果安装JRE ,问题是jre\lib\security文件夹中local_policy.jar中文件default_local.policy的内容:
// Some countries have import limits on crypto strength. This policy file
// is worldwide importable.
grant {
permission javax.crypto.CryptoPermission "DES", 64;
permission javax.crypto.CryptoPermission "DESede", *;
permission javax.crypto.CryptoPermission "RC2", 128,
"javax.crypto.spec.RC2ParameterSpec", 128;
permission javax.crypto.CryptoPermission "RC4", 128;
permission javax.crypto.CryptoPermission "RC5", 128,
"javax.crypto.spec.RC5ParameterSpec", *, 12, *;
permission javax.crypto.CryptoPermission "RSA", *;
permission javax.crypto.CryptoPermission *, 128;
};
Run Code Online (Sandbox Code Playgroud)
如果您不需要全球有效设置,您只需编辑此文件并将内容更改为
// Country-specific policy file for countries with no limits on crypto strength.
grant {
// There is no restriction to any algorithms.
permission javax.crypto.CryptoAllPermission;
};
Run Code Online (Sandbox Code Playgroud)
如果从Oracle下载JCE,那就是这个问题.
| 归档时间: |
|
| 查看次数: |
392095 次 |
| 最近记录: |