Zadałem pytanie na ten temat wcześniej, ale nie otrzymałem właściwej odpowiedzi i nigdzie nie zaprowadziłem.
Wyjaśniłem więc kilka szczegółów na temat problemu i naprawdę chciałbym usłyszeć wasze pomysły na to, jak mogę to naprawić lub co powinienem spróbować.
Mam Java 1.6.0.12 zainstalowaną na moim serwerze Linux, a poniższy kod działa idealnie.
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);
}
Dzisiaj zainstalowałem Javę 1.6.0.26 na moim serwerze i kiedy próbuję uruchomić aplikację, otrzymuję następujący wyjątek. Domyślam się, że ma to związek z konfiguracją instalacji Java, ponieważ działa w pierwszej, ale nie działa w późniejszej wersji.
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
Linia 25 to:
c.init(Cipher.DECRYPT_MODE, secretKeySpec);
Uwagi:
* java.security w katalogu java na serwerze 1.6.0.12 jest prawie całkowicie zgodna z plikiem java.security w wersji 1.6.0.26. W pierwszym nie ma żadnych dodatkowych dostawców.
* Poprzednie pytanie jest tutaj .
Caused by: java.security.InvalidKeyException: Illegal key size
(bez „lub parametrów domyślnych”) w Javie 8Odpowiedzi:
Najprawdopodobniej nie masz teraz zainstalowanego pliku nieograniczonej siły.
Może być konieczne pobranie tego pliku:
Java Cryptography Extension (JCE) Pliki nieograniczonej siły Jurysdykcja 6
Java Cryptography Extension (JCE) Pliki z nieograniczoną siłą Zasady jurysdykcji 7 Pobieranie
Java Cryptography Extension (JCE) Nieograniczona siła Jurysdykcja Pliki zasad 8 Pliki do pobrania (wymagane tylko dla wersji wcześniejszych niż Java 8 u162)
Wyodrębnij pliki jar z zip i zapisz je w
${java.home}/jre/lib/security/
.źródło
Java/jre/lib/security
,Java/jdk/lib/security
iJava/jdk/jre/lib/security
. Uruchomienie „java -version” zwraca oczekiwane szczegóły.Pliki jurysdykcji JRE / JDK / Java 8 można znaleźć tutaj:
Java Cryptography Extension (JCE) Nieograniczona siła Pliki zasad jurysdykcji 8 Pobieranie
Jak James powiedział powyżej:
zainstaluj pliki w
${java.home}/jre/lib/security/
.źródło
W przypadku JAVA 7 link do pobrania to jce-7-download
Skopiuj dwa pobrane słoiki z Java \ jdk1.7.0_10 \ jre \ lib \ security
Zrób kopię zapasową starszych słoików, aby być bezpieczniejszym.
W przypadku JAVA 8 link do pobrania to jce-8-download
Skopiuj pobrane słoiki w Javie \ jdk1.8.0_45 \ jre \ lib \ security
Wykonaj kopię zapasową starszych słoików, aby być bezpieczniejszym.
źródło
W przypadku Java 9, Java 8u161 , Java 7u171 i Java 6u181 ograniczenie jest teraz domyślnie wyłączone. Zobacz problem w bazie danych błędów Java .
Począwszy od Java 8u151 możesz programowo wyłączyć ograniczenie.
Zamiast tego możesz teraz wywołać następujący wiersz przed pierwszym użyciem klas JCE (tzn. Najlepiej zaraz po uruchomieniu aplikacji):
źródło
Jest to rozwiązanie tylko dla kodu . Nie ma potrzeby pobierania ani bałagania przy użyciu plików konfiguracyjnych.
To rozwiązanie oparte na refleksji, przetestowane na Javie 8
Wywołaj tę metodę raz na początku programu.
//Import
//metoda
Kredyty: Delthas
źródło
„Pliki zasad Java Cryptography Extension (JCE) Unlimited Strength Jurysdykcji 6”
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
źródło
Wystąpił ten sam błąd podczas korzystania z systemu Windows 7 x64, Eclipse i JDK 1.6.0_30. W folderze instalacyjnym JDK znajduje się
jre
folder. Z początku mnie to zniechęciło, ponieważ bez powodzenia dodawałem wyżej wymienione słoiki do folderu lib / security JDK. Pełna ścieżka:Pobierz i wyodrębnij pliki zawarte w
jce
folderze tego archiwum do tego folderu.źródło
W Javie domyślnie AES obsługuje klucz 128-bitowy, jeśli planujesz użyć klucza 192-bitowego lub 256-bitowego, program kompilujący Java wyrzuci wyjątek dotyczący nielegalnego klucza, który otrzymujesz.
Rozwiązanie jest takie, jak sugerował zwycięzca i James, musisz pobrać JCE (Java Cryptography Extension) zgodnie z wersją JRE (java6, java7 lub java8).
Plik zip JCE zawiera następujący plik JAR:
Musisz wymienić te słoiki ze swojego
<JAVA_HOME>/jre/lib/security
. jeśli korzystasz z systemu uniksowego, prawdopodobnie będzie się to odnosić/home/urs/usr/lib/jvm/java-<version>-oracle/
Czasami po prostu zamiana local_policy.jar, US_export_policy.jar w folderze bezpieczeństwa nie działa na Uniksie, więc sugeruję najpierw skopiować folder bezpieczeństwa na pulpit, zastąpić folder @ Desktop / security w słoiku, usunąć folder bezpieczeństwa z / jre / lib / i przenieś folder zabezpieczeń pulpitu do / jre / lib /.
np. :: sudo mv security
/usr/lib/jvm/java-7-oracle/jre/lib
źródło
Jest to krótka dyskusja na temat tego, co wydaje się być to problem tutaj . Strona, do której prowadzi, wydaje się zniknąć, ale jedną z odpowiedzi może być to, czego potrzebujesz:
źródło
US_export_policy.jar
ilocal_policy.jar
moim folderze lib / security już po zainstalowaniu Java .. I nie mógł znaleźć rdzeń / lib / JCE nawiasem mówiąc w moim folderze instalacyjnym Java.problemem jest zawartość pliku default_local.policy w local_policy.jar w folderze jre \ lib \ security , jeśli zainstalujesz JRE:
jeśli nie potrzebujesz prawidłowych ustawień na całym świecie, możesz po prostu edytować ten plik i zmienić zawartość na
to, co otrzymasz, jeśli pobierzesz JCE z Oracle.
źródło
Dostałem również problem, ale po zamianie istniejącego na pobrany (z JCE) rozwiązałem problem. Nowe pliki kryptograficzne zapewniały nieograniczoną siłę.
źródło
Domyślnie Java obsługuje szyfrowanie tylko w rozmiarze 128-bitowym (16 bajtów) klucza AES. Jeśli nie potrzebujesz więcej niż obsługiwanej domyślnie, możesz przyciąć klucz do odpowiedniego rozmiaru przed użyciem
Cipher
. Zobacz javadoc dla domyślnych obsługiwanych kluczy.Jest to przykład generowania klucza, który działałby z dowolną wersją JVM bez modyfikowania plików zasad. Używaj według własnego uznania.
Oto dobry artykuł na temat tego, czy klucz od 128 do 256 kluczy ma znaczenie na blogu AgileBits
źródło
Począwszy od Java 9 lub 8u151, możesz użyć komentarza do wiersza w pliku:
I zmień:
do
źródło
Jeśli używasz dystrybucji Linuksa z apt i dodałeś webupd8 PPA, możesz po prostu uruchomić polecenie
Inne aktualizacje:
Począwszy od wersji Java 8 Update 151 , zasady jurysdykcji nieograniczonej siły są dołączone do Java 8, ale nie są domyślnie używane. Aby go włączyć, musisz edytować plik java.security w
<java_home>/jre/lib/security
(dla JDK) lub<java_home>/lib/security
(dla JRE). Odkomentuj (lub dołącz) linięcrypto.policy=unlimited
Upewnij się, że edytujesz plik za pomocą edytora uruchomionego jako administrator. Zmiana zasad obowiązuje dopiero po ponownym uruchomieniu maszyny JVM
Przed aktualizacją Java 8 Update 151 pozostałe odpowiedzi są ważne. Pobierz pliki zasad jurysdykcji JCE Unlimited i wymień je.
Aby uzyskać więcej informacji, zapoznaj się z moim osobistym postem na blogu poniżej - Jak zainstalować pliki zasad jurysdykcji Java Cryptography Extension (JCE) o nieograniczonej sile
źródło
istnieją dwie opcje rozwiązania tego problemu
opcja numer 1: użyj certyfikatu o mniejszej długości RSA 2048
opcja numer 2: zaktualizujesz dwa słoiki w
jre\lib\security
dowolnym języku java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.htmllub korzystasz z serwisu WWW IBM lub dowolnego serwera aplikacji korzystającego z jego Java. główny problem, z którym się spotkałem, użyłem certyfikacji o maksymalnej długości, gdy wdrożyłem uszy w sieci, zgłaszany jest ten sam wyjątek
zaktualizowałem zintegrowany folder Java w websphere za pomocą dwóch słoików https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US
możesz sprawdzić referencję w linku https://www-01.ibm.com/support/docview.wss?uid=swg21663373
źródło
Upewnij się, że używasz najnowszej wersji JDK / JRE .
W moim przypadku umieściłem JCE w folderze JRE, ale to nie pomogło. Stało się tak, ponieważ prowadziłem projekt bezpośrednio z IDE (używając JDK).
Następnie zaktualizowałem JDK i JRE do najnowszej wersji (1.8.0_211) i problem zniknął.
Więcej informacji: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8170157
źródło
Domyślnie JDK obsługuje szyfrowanie tylko za pomocą 128-bitowych kluczy ze względu na ograniczenia amerykańskie. Aby obsługiwać szyfrowanie z klucza o długości 256 bitów, musimy go wymienić
local_policy.jar
iUS_export_policy.jars
w$JAVA_HOME/java-8-oracle/jre/lib/security
folderze, w przeciwnym razie da:źródło
Musisz tam iść
/jdk1.8.0_152 | / jre | / lib | / bezpieczeństwo | java.security i odkomentuj
do
źródło