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 7u171 및 Java 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이 포함되어 있습니다.
- local_policy.jar
- 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
기타 업데이트:
- 무제한 강도 관할권 정책 파일은 Java 9에 포함되어 기본적으로 사용됩니다.
- Java 8 Update 161 이후 Java 8은 기본적으로 Unlimited Strength Curritory Policy로 설정됩니다.
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\security
java 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
'programing' 카테고리의 다른 글
GDB에서 #defined constant를 인쇄하려면 어떻게 해야 합니까? (0) | 2022.08.17 |
---|---|
vue.dister Web 컴포넌트 등록 (0) | 2022.08.17 |
gcc를 사용하여 __uint128_t 번호를 인쇄하는 방법 (0) | 2022.08.17 |
오류: 함수가 로컬 변수의 주소를 반환합니다. (0) | 2022.08.17 |
어레이를 컨트롤러에서 vue.js v-for로 전달하는 방법 (0) | 2022.08.10 |