[java] 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);
}

오늘은 서버 사용자에게 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 7u171Java 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 폴더에 포함 된 파일을 다운로드 하여 해당 폴더로 추출하십시오 .