programing

Java 보안:잘못된 키 크기 또는 기본 매개 변수입니까?

randomtip 2022. 8. 17. 20:52
반응형

Java 보안:잘못된 키 크기 또는 기본 매개 변수입니까?

아까 질문도 해봤는데 답이 안 나와서 아무 것도 안 나왔어요.

이 문제에 대한 자세한 내용은 몇 가지 설명 드렸습니다.이 문제를 어떻게 해결할 것인지, 무엇을 시도해야 하는지에 대한 귀하의 의견을 꼭 듣고 싶습니다.

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);
}

오늘 서버 사용자에게 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 파일과 거의 완전히 일치합니다.첫 번째 프로바이더에는 추가 프로바이더는 없습니다.
* 이전 질문입니다.

아마도 현재 무제한 강도 파일이 설치되어 있지 않을 것입니다.

다음 파일을 다운로드해야 할 수 있습니다.

Java Cryptography Extension(JCE) 무제한 강도 관할권 정책 파일 6

Java Cryptography Extension(JCE) 무제한 강도 관할권 정책 파일7 다운로드

Java Cryptography Extension(JCE) 무제한 강도 관할권 정책 파일8 다운로드 (Java 8 u162 이전 버전에만 필요)

하여 zip에 합니다.${java.home}/jre/lib/security/.

JRE/JDK/Java 8 관할권 파일은 다음 URL에서 찾을 수 있습니다.

Java Cryptography Extension(JCE) 무제한 강도 관할권 정책 파일8 다운로드

James james ★★★★★★★★★★★★★★★★★★★★★★★」
을 인스톨 합니다.${java.home}/jre/lib/security/.

Java 9, Java 8u161, Java 7u171Java 6u181에서는 이 제한이 기본적으로 비활성화되어 있습니다.Java Bug Database의 문제를 참조하십시오.


Java 8u151부터는 제한을 프로그래밍 방식으로 비활성화할 수 있습니다.

이전 릴리스에서는 JDK에서 무제한 암호화를 사용할 수 있도록 JCE 관할권 파일을 별도로 다운로드하여 설치해야 했습니다.다운로드 및 설치 단계는 더 이상 필요하지 않습니다.

대신 JCE 클래스를 처음 사용하기 전에 다음 행을 호출할 수 있습니다(즉, 응용 프로그램 시작 직후가 좋습니다.

Security.setProperty("crypto.policy", "unlimited");

JAVA 7의 경우 다운로드 링크는 jce-7-download입니다.

\jdk1.7.0_10\jre\lib\security로 의 jar를 합니다.
안전을 위해 오래된 항아리를 백업해 두세요.

JAVA 8의 경우 다운로드 링크는 jce-8-download입니다.
를 Java\lib\securityJava\jdk1.8.0_45\jre\lib\security로
안전을 위해 오래된 항아리를 백업해 두세요.

이것은 코드 전용 솔루션입니다.컨피규레이션파일을 다운로드하거나 조작할 필요가 없습니다.

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
}

크레딧:델타스

Java에서는 디폴트로 AES가 128비트키를 지원하며 192비트키 또는 256비트키를 사용할 경우 Java 컴파일러는 Ilgulate key size Exception을 슬로우합니다.

해결책은 victor & James의 제안대로 JRE 버전(Java6, java7, 또는 java8)에 따라 JCE(Java Cryptography Extension)를 다운로드해야 합니다.

JCE zip에는 다음 JAR이 포함되어 있습니다.

  1. local_policy.jar
  2. US_export_policy.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/에서 보안 폴더를 /jre/lib/로 이동할 것을 권장합니다.

security : : sudo mv 안 eg/usr/lib/jvm/java-7-oracle/jre/lib

자바 암호화 확장(JCE) 무제한 강도 관할권 정책 파일 6

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

Windows 7 x 64, Eclipse © JDK 1.6.0 _ 30 。에는 JDK가 .jre폴더입니다.JDK lib/security jars, jars, jars.체체: :

C:\Program Files\Java\jdk1.6.0_30\jre\lib\security

에 포함된 파일을 다운로드하여 압축을 푼다.jce아카이브의 폴더를 해당 폴더로 이동합니다.

여기에서는, 이 문제에 대해 간단하게 설명합니다.링크되어 있는 페이지는 없어 보입니다만, 다음의 몇개의 응답이 필요한 경우가 있습니다.

실제로 US_export_policy.jar 및 local_policy.jar를 core/lib/jce에서 $JAVA_로 복사한다.HOME/jre/lib/security가 도움이 되었습니다.고마워요.

문제는 default_local 파일의 내용입니다.jre\lib\security 폴더에 있는 local_policy.jar의 정책(JRE를 설치하는 경우):

// 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;
};

전 세계적으로 유효한 설정이 필요 없는 경우는, 이 파일을 편집해, 컨텐츠를 다음의 순서로 변경할 수 있습니다.

// Country-specific policy file for countries with no limits on crypto strength.
grant {
    // There is no restriction to any algorithms.
    permission javax.crypto.CryptoAllPermission;
};

Oracle에서 JCE를 다운로드하면 얻을 수 있습니다.

저도 문제가 발생했지만 기존 것을 (JCE에서) 다운로드한 것으로 교체한 후 문제가 해결되었습니다.새로운 암호화 파일은 무제한 강도를 제공했습니다.

Linux 디스트리뷰션을 apt와 함께 사용하고 있으며 webupd8 PPA가 추가된 경우 명령어를 실행하기만 하면 됩니다.

apt-get install oracle-java8-unlimited-jce-policy

기타 업데이트:

  1. 무제한 강도 관할권 정책 파일은 Java 9에 포함되어 기본적으로 사용됩니다.
  2. Java 8 Update 161 이후 Java 8은 기본적으로 Unlimited Strength Curritory Policy로 설정됩니다.
  3. Java 8 Update 151 이후로는 무제한 강도 관할권 정책이 Java 8에 포함되지만 기본적으로는 사용되지 않습니다.이를 활성화하려면 에서 java.security 파일을 편집해야 합니다.<java_home>/jre/lib/security경우) (JDK의 경우)<java_home>/lib/security(JRE ★★★★★★★★★★★★★★★★)주석 해제( 포함)

    crypto.policy=unlimited

    관리자 권한으로 실행한 편집기를 사용하여 파일을 편집해야 합니다.정책 변경은 JVM을 재시작한 후에만 적용됩니다.

Java 8 업데이트 151 이전, 나머지 답변은 유효합니다.JCE Unlimited Strength Curritory 정책 파일을 다운로드하여 바꿉니다.

자세한 내용은 아래 개인 블로그 투고 - Java Cryptography Extension (JCE) 무제한 강도 관할권 정책 파일을 설치하는 방법을 참조하십시오.

기본적으로 Java는 암호화에 AES 128비트(16바이트) 키 크기만 지원합니다. 이상의 하지 않은 경우 키를 할 수 .Cipher지원되는 기본 키에 대해서는 javadoc을 참조하십시오.

다음 예제에서는 정책 파일을 수정하지 않고 모든 JVM 버전에서 작동하는 키를 생성하는 방법을 보여 줍니다.자유 재량으로 사용하세요.

다음은 AgileBits 블로그에서 128~256개의 키 크기가 중요한지에 대한 좋은 기사입니다.

SecretKeySpec getKey() {
    final pass = "47e7717f0f37ee72cb226278279aebef".getBytes("UTF-8");
    final sha = MessageDigest.getInstance("SHA-256");

    def key = sha.digest(pass);
    // use only first 128 bit (16 bytes). By default Java only supports AES 128 bit key sizes for encryption.
    // Updated jvm policies are required for 256 bit.
    key = Arrays.copyOf(key, 16);
    return new SecretKeySpec(key, AES);
}

Java 9 또는 8u151부터는 파일 내에서 주석 행을 사용할 수 있습니다.

<JAVA_HOME>/jre/lib/security/java.security

변경:

#crypto.policy=unlimited

로.

crypto.policy=unlimited

이 문제를 해결할 수 있는 두 가지 옵션이 있습니다.

옵션 번호 1 : 길이가 짧은 RSA 2048 증명서를 사용합니다.

옵션 번호 2 : 에서 2개의 jar를 갱신합니다.jre\lib\securityjava http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html 를 사용하는 경우

또는 IBM websphere 또는 그 java를 사용하는 응용 프로그램서버를 사용합니다.제가 직면했던 주요 문제는 websphere에 ears를 도입했을 때 동일한 예외가 느려집니다.

Java Security: Illegal key size or default parameters?

웹 페이지의 Java Intsalled 폴더를 2개의 jars로 업데이트했습니다.https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

https://www-01.ibm.com/support/docview.wss?uid=swg21663373 링크에서 참조를 확인할 수 있습니다.

최신 버전의 JDK/JRE를 사용해야 합니다.

제 경우 JCE를 JRE 폴더에 넣었지만 도움이 되지 않았습니다.IDE에서 직접 프로젝트를 실행하고 있었기 때문에(JDK를 사용하여) 발생했습니다.

그런 다음 JDK와 JRE를 최신 버전(1.8.0_211)으로 업데이트하면 문제가 해결되었습니다.

상세: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8170157

디폴트 JDK는 미국의 제한으로 128비트키를 통한 암호화만 지원합니다.따라서 256비트 길이의 키에서 암호화를 지원하려면local_policy.jar그리고.US_export_policy.jars$JAVA_HOME/java-8-oracle/jre/lib/security그렇지 않으면 다음 정보가 나타납니다.

java.security.무효 키예외:잘못된 키 크기 또는 기본값

당신은 그곳에 가야 합니다.

/jdk1.8.0_security | /jre | /lib | /security | java.security 및 언코멘트 해제

#crypto.policy=unlimited

로.

crypto.policy=unlimited

Java 6용 아래 링크에서 JCE 파일 다운로드

https://www.oracle.com/java/technologies/jce-6-download.html

Java 8용 아래 링크에서 JCE 파일 다운로드

https://www.oracle.com/java/technologies/javase-jce8-downloads.html

위의 링크에서 다운로드한 파일을 복사하여 JDK 설치 디렉토리로 이동합니다.

/Users/ik/jdk1.8.0_72/jre/lib/security

디렉토리에서 파일을 붙여넣고 바꿉니다.애플리케이션을 재기동하면, 에러가 해결됩니다.

언급URL : https://stackoverflow.com/questions/6481627/java-security-illegal-key-size-or-default-parameters

반응형