나는 이것에 대해 이전에 질문을했지만, 제대로 대답하지 못했으며 아무데도 주도하지 못했습니다.
문제에 대한 몇 가지 세부 사항을 명확히 했으므로 어떻게 해결할 수 있는지 또는 무엇을 시도 해야하는지에 대한 아이디어를 듣고 싶습니다.
내가 가진 자바 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);
}
오늘은 서버 사용자에게 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
25 행 :
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
참고 :
* 서버 1.6.0.12 java 디렉토리의 java.security 는 1.6.0.26 java.security 파일 과 거의 완전히 일치 합니다. 첫 번째 공급자에는 추가 공급자가 없습니다.
* 이전 질문은 여기에 있습니다 .
답변
현재 무제한 강도 파일이 설치되어 있지 않을 가능성이 큽니다.
이 파일을 다운로드해야 할 수도 있습니다.
JCE (Java Cryptography Extension) 무제한 강도 관할 정책 파일 6
JCE (Java Cryptography Extension) 무제한 강도 관할 정책 파일 7 다운로드
JCE (Java Cryptography Extension) 무제한 강도 관할 정책 파일 8 다운로드 (Java 8 u162 이전 버전에만 필요)
zip에서 jar 파일을 추출하여에 저장하십시오 ${java.home}/jre/lib/security/
.
답변
JRE / JDK / Java 8 관할권 파일은 여기에서 찾을 수 있습니다.
JCE (Java Cryptography Extension) 무제한 강도 관할 정책 파일 8 다운로드
James가 위에서 말한 것처럼 :
에 파일을 설치하십시오 ${java.home}/jre/lib/security/
.
답변
JAVA 7의 경우 다운로드 링크는 jce-7-download입니다.
Java \ jdk1.7.0_10 \ jre \ lib \ security에 다운로드 된 두 jar를 복사하십시오
.
JAVA 8의 경우 다운로드 링크는 jce-8-download입니다
. 다운로드 된 jar 파일을 Java \ jdk1.8.0_45 \ jre \ lib \ security에 복사
하십시오. 이전 jar 파일을 더 안전하게 백업하십시오.
답변
Java 9, Java 8u161 , Java 7u171 및 Java 6u181 에서는 기본적 으로이 제한이 비활성화되어 있습니다. Java 버그 데이터베이스의 문제를 참조하십시오 .
Java 8u151 부터는 프로그래밍 방식으로 제한을 비활성화 할 수 있습니다.
이전 릴리스에서는 JDK에서 무제한 암호화를 사용할 수 있도록 JCE 관할권 파일을 별도로 다운로드하여 설치해야했습니다. 더 이상 다운로드 및 설치 단계가 필요하지 않습니다.
대신 JCE 클래스를 처음 사용하기 전에 (즉, 응용 프로그램을 시작한 직후) 다음 줄을 호출 할 수 있습니다.
Security.setProperty("crypto.policy", "unlimited");
답변
이것은 코드 전용 솔루션 입니다. 구성 파일을 다운로드하거나 엉망으로 만들 필요가 없습니다.
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;
//방법
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
}
크레딧 : Delthas
답변
“JCE (Java Cryptography Extension) 무제한 강도 관할 정책 파일 6”
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
답변
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
이 아카이브jce
폴더에 포함 된 파일을 다운로드 하여 해당 폴더로 추출하십시오 .
