Java Güvenliği: Geçersiz anahtar boyutu mu yoksa varsayılan parametreler mi?


409

Bu konuda daha önce bir soru sormuştum, ama doğru cevaplanmadı ve hiçbir yere götürmedi.

Bu yüzden sorunla ilgili birkaç ayrıntıyı açıkladım ve bunu nasıl düzeltebileceğim ya da neyi denemem gerektiğine dair fikirlerinizi duymak istiyorum.

Ben Java 1.6.0.12 benim Linux sunucu ve sadece mükemmel çalışır aşağıdaki kodu yüklü.

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

Bugün Java 1.6.0.26'yı sunucu kullanıcıma yükledim ve uygulamamı çalıştırmaya çalıştığımda aşağıdaki istisnayı alıyorum. Benim tahminim, Java kurulum yapılandırmasıyla bir ilgisi var çünkü ilkinde çalışıyor, ancak sonraki sürümde çalışmıyor.

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

Satır 25 : c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Notlar:
* Sunucunun 1.6.0.12 java dizinindeki java.security , 1.6.0.26 java.security dosyasıyla neredeyse tamamen eşleşir . Birincisinde ek sağlayıcı yok.
* Bir önceki soru burada .



4
Bu ayrıca hata olarak da atılabilir: Caused by: java.security.InvalidKeyException: Illegal key sizeJava 8'de ("veya varsayılan parametreler olmadan")
hackajar

Sadece OpenJDK kullanın ve işe yarayacak.
Rodrigo Asensio

@RodrigoAsensio: OpenJDK kullanıyorum ve onunla çalışmıyor. Sınırsız Güç Yetkisi Politikası Dosyaları jar dosyalarını yüklemelisiniz. Ve sonra işe yarayacak.
anjanb

5
@AniketThakur yanıtına güncelleyin. Java 9 ve Java 8u151'den beri, artık yetki politikası dosyalarını indirip manuel olarak yüklemenize gerek yoktur. Sınırsız şifrelemeyi etkinleştirmek için yeni crypto.policy Güvenlik özelliğini kullanabilirsiniz. Java.security dosyasında yeni Security özelliği (crypto.policy) ayarlanmışsa veya JCE çerçevesi başlatılmadan önce Security.setProperty () çağrısı kullanılarak dinamik olarak ayarlanmışsa, bu ayar dikkate alınır. Varsayılan olarak, özellik tanımsız olacaktır.
Marcin Kłopotek

Yanıtlar:


722

Büyük olasılıkla şu anda yüklü sınırsız güç dosyanız yok.

Bu dosyayı indirmeniz gerekebilir:

Java Şifreleme Uzantısı (JCE) Sınırsız Güç Yetkisi Politika Dosyaları 6

Java Şifreleme Uzantısı (JCE) Sınırsız Güç Yargı İlkesi Dosyaları 7 İndir

Java Şifreleme Uzantısı (JCE) Sınırsız Güç Yetkisi Politikası Dosyaları 8 İndir (yalnızca Java 8 u162 öncesi sürümler için gereklidir)

Jar dosyalarını zip'ten çıkarın ve içine kaydedin ${java.home}/jre/lib/security/.


2
@JamesBlack - Evet, ve tabii bütün bazlar ben kavanoz altından koymak kaplıydı yapmak Java/jre/lib/security, Java/jdk/lib/securityve Java/jdk/jre/lib/security. 'Java -version' çalıştırılması beklenen ayrıntıları döndürür.
aroth


4
Java 9 ve Java 8u151'den beri, artık yetki politikası dosyalarını indirip manuel olarak yüklemenize gerek yoktur. Sınırsız şifrelemeyi etkinleştirmek için yeni crypto.policy Güvenlik özelliğini kullanabilirsiniz. Java.security dosyasında yeni Security özelliği (crypto.policy) ayarlanmışsa veya JCE çerçevesi başlatılmadan önce Security.setProperty () çağrısı kullanılarak dinamik olarak ayarlanmışsa, bu ayar dikkate alınır. Varsayılan olarak, özellik tanımsız olacaktır.
Marcin Kłopotek

4
Yani, bu onaylanan cevap artık güncel değil ve kullanımdan kaldırıldı. Nasıl upvote veya böylece bu cevabı baskılamak do stackoverflow.com/a/46857694/2808798 cevabı "kabul" edilebilir?
Jesse Adelman

3
@JesseAdelman - Ne yazık ki bu neredeyse 7 yaşında, çok fazla şey yapılamaz. Kim isterse değiştirmeli.
James Black

54

JRE / JDK / Java 8 yetki dosyalarına buradan ulaşabilirsiniz:

Java Şifreleme Uzantısı (JCE) Sınırsız Güç Yargı İlkesi Dosyaları 8 İndir

James'in yukarıda söylediği gibi:
Dosyaları yükleyin ${java.home}/jre/lib/security/.


2
6 ve 7 kullanarak denedim, ama işe yaramadı. 8 yüklemek zorunda kaldı. Teşekkürler.
Jason Kim

9
Yeni sürüm JDK 8u151, "kripto politikasını kontrol etmek için Yeni Güvenlik özelliğine" sahip. Şimdi geçiş yapmak için bir özellik değişikliği. Alt satır: 256 bit anahtarların kullanılabilmesini sağlamak için "lib \ security \ java.security" deki "#" satırından "# crypto.policy = unlimited" satırını kaldırın. oracle.com/technetwork/java/javase/8u151-relnotes-3850493.html
hemisphire

1
Teşekkürler! Bu bir güvenlik özelliği olduğundan, Security.setProperty'yi de ("crypto.policy", "sınırsız") çağırabilirsiniz. Kaynak: @hemisphire 'nin bağlantısı :)
Fluf

42

JAVA 7 için indirme linki jce-7-download

İndirilen iki kavanoz Java \ jdk1.7.0_10 \ jre \ lib \ security klasörüne kopyalayın
güvenli olan eski kavanozların yedeğini alın.

JAVA 8 için indirme linki jce-8-download
İndirilen kavanozları Java \ jdk1.8.0_45 \ jre \ lib \ security içine
kopyalayın Daha güvenli olan eski kavanozların yedeğini alın.


39

Java 9, Java 8u161 , Java 7u171 ve Java 6u181 ile sınırlama artık varsayılan olarak devre dışıdır. Bkz Java Hata Veritabanı sorunu .


Java 8u151 ile başlayarak sınırlamayı programlı olarak devre dışı bırakabilirsiniz.

Eski sürümlerde, JCE yetki alanı dosyalarının JDK tarafından sınırsız şifreleme kullanılmasına izin vermek için ayrı olarak indirilmesi ve kurulması gerekiyordu. İndirme ve yükleme adımlarına artık gerek yoktur.

Bunun yerine artık JCE sınıflarını ilk kez kullanmadan önce (tercihen uygulama başladıktan hemen sonra) aşağıdaki satırı çağırabilirsiniz:

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

Android'de ne olacak? Bu kısıtlama yöntemleri hangi API düzeyinde çözülebilir?
TheRealChx101

31

Bu sadece kod çözümü . Yapılandırma dosyalarını indirmeye veya karıştırmaya gerek yok.

Java 8'de test edilen yansıma tabanlı bir çözümdür

Bu yöntemi programınızın başında bir kez çağırın.

// İthalat

import javax.crypto.Cipher;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Map;

//yöntem

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
}

Kredi: Delthas


4
Bunun Java SE lisans sözleşmesini ihlal edebileceğini lütfen unutmayın: D. JAVA TEKNOLOJİ KISITLAMALARI. "Java", "Java", " herhangi bir adlandırma kuralı atamasında Oracle tarafından belirtilen javafx "," sun "," oracle "veya benzeri bir sözleşme. [...] kaynak
SimMac

Çok teşekkür ederim


16

Windows 7 x64, Eclipse ve JDK 1.6.0_30 kullanırken aynı hatayla karşılaştım. JDK kurulum klasöründe bir jreklasör vardır. JDK'nın lib / güvenlik klasörüne şanssız bir şekilde eklediğim için bu beni ilk başta attı. Tam yol:

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

Bu arşivinjce klasöründeki dosyaları indirip bu klasöre çıkarın .


16

Java'da, varsayılan olarak AES 128 Bit anahtarı destekler, 192 Bit veya 256 Bit anahtar kullanmayı planlıyorsanız, java complier, aldığınız Yasadışı anahtar boyutu İstisnasını atar.

Çözüm victor & James'in önerdiği gibi, JRE (Java Cryptography Extension) 'ı JRE sürümünüze (java6, java7 veya java8) göre indirmeniz gerekecek.

JCE zip aşağıdaki JAR içerir:

  1. local_policy.jar
  2. US_export_policy.jar

Bu kavanozu değiştirmeniz gerekir <JAVA_HOME>/jre/lib/security. Eğer bir unix sistemindeyseniz,/home/urs/usr/lib/jvm/java-<version>-oracle/

Bazen güvenlik klasöründeki local_policy.jar, US_export_policy.jar'ın değiştirilmesi unix üzerinde çalışmaz, bu yüzden önce güvenlik klasörünü masaüstünüze kopyalamanızı, kavanozun @ Desktop / security klasörünü değiştirmenizi, güvenlik klasörünü / jre / lib'den silmenizi öneririm / & Desktop güvenlik klasörünü / jre / lib / dizinine taşıyın.

ör .: sudo mv güvenliği /usr/lib/jvm/java-7-oracle/jre/lib


5

Burada bu sorunun ne olduğu hakkında kısa bir tartışma var . Bağlantı verdiği sayfa gitmiş gibi görünüyor, ancak yanıtlardan biri ihtiyacınız olan şey olabilir:

Gerçekten de US_export_policy.jar ve local_policy.jar dosyasını core / lib / jce'den $ JAVA_HOME / jre / lib / security dizinine kopyalamak yardımcı oldu. Teşekkürler.


Teşekkürler, ama Java yüklendikten sonra zaten lib / güvenlik klasörüm vardı US_export_policy.jarve local_policy.jarJava kurulum klasörümde bu arada core / lib / jce bulamadım.
Rihards

5

sorundur içerik dosyası default_local.policy içinde local_policy.jar klasöründe jre \ lib \ güvenlik Eğer JRE yüklerseniz,:

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

dünya çapında geçerli ayarlara ihtiyacınız yoksa bu dosyayı düzenleyebilir ve içeriği

// 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'dan JCE'yi indirirseniz bu elde edersiniz.


4

Ayrıca sorunu aldım ama mevcut olanı indirilen (JCE'den) ile değiştirdikten sonra bir sorun çözüldü. Yeni kripto dosyaları sınırsız güç sağladı.


2

Varsayılan olarak, Java şifreleme için yalnızca AES 128 bit (16 bayt) anahtar boyutlarını destekler. Desteklenen varsayılandan daha fazlasına ihtiyacınız yoksa, kullanmadan önce anahtarı uygun boyuta getirebilirsiniz Cipher. Bkz. JavadocVarsayılan desteklenen anahtarlar için .

Bu, ilke dosyalarını değiştirmeden herhangi bir JVM sürümü ile çalışacak bir anahtar üretme örneğidir. Kendi takdirinize bağlı olarak kullanın.

AgileBits Blog'da 128 ila 256 anahtar boyutunun önemli olup olmadığı hakkında iyi bir makale

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

Şifreleme Her kripto türü için geçerli anahtar boyutlarda sınıflar dokümantasyon noktaları.
keaplogik

FIPS 197'de NIST tarafından belirtildiği gibi Oracle Şifreleme (Şifreleme) Algoritmaları AES: Gelişmiş Şifreleme Standardı belgesine bakın. Joan Daemen ve Vincent Rijmen tarafından Rijndael algoritması olarak da bilinen AES, 128, 192, ve 256 bit.
zaph

Bu doğru olabilir, ancak her Java sürümünde yalnızca sınıf belgelerinde belirtildiği gibi 128 bit'i desteklemesi gerekir. Kendiniz test edin ve diğer anahtar boyutları yapmak için James Black'in cevabından politika kavanozuna ihtiyacınız olduğunu göreceksiniz
keaplogik

256-bit anahtarları desteklemeyen herhangi bir AES uygulaması, 256-bit anahtarlar kullanarak çok sayıda AES şifrelemesinin şifresini çözemeyeceği için temelde işe yaramaz.
zaph

1
256-bit anahtar gerekiyorsa, en iyi çözüm, belki de tek çözüm, gerektiğinde İlke dosyasını yüklemek, güvenliği zayıflatacak anahtarı kısaltmamaktır ve birlikte çalışabilirlik durumunda mümkün olmayabilir.
zaph

2

Java 9 veya 8u151'den başlayarak, dosyadaki bir satırı yorum kullanabilirsiniz:

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

Ve değişim:

#crypto.policy=unlimited

için

crypto.policy=unlimited

2

Apt ile Linux dağıtımı kullanıyorsanız ve webupd8 PPA eklediyseniz, sadece komutu çalıştırabilirsiniz.

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

Diğer güncellemeler:

  1. Sınırsız Güç Yetkisi İlkesi Dosyaları Java 9 ile birlikte gelir ve varsayılan olarak kullanılır
  2. Java 8 Güncellemesi 161'den başlayarak , Java 8 varsayılan olarak Sınırsız Güç Yetkilendirme Politikası'nı kullanır.
  3. Java 8 Güncelleme 151'den başlayarak , Sınırsız Güç Yetkilendirme Politikası Java 8'de bulunur ancak varsayılan olarak kullanılmaz. Etkinleştirmek için, <java_home>/jre/lib/security(JDK için) veya <java_home>/lib/security(JRE için ) içindeki java.security dosyasını düzenlemeniz gerekir . Satırı kaldır (veya dahil et)

    crypto.policy=unlimited

    Yönetici olarak çalıştırılan bir düzenleyici kullanarak dosyayı düzenlediğinizden emin olun. Politika değişikliği yalnızca JVM yeniden başlatıldıktan sonra yürürlüğe girer

Java 8 Güncellemesinden önce 151 cevapların geri kalanı geçerlidir. JCE Sınırsız Gücü Yargı Yetkisi Politikası Dosyalarını indirin ve değiştirin.

Daha fazla ayrıntı için aşağıdaki kişisel blog gönderime başvurabilirsiniz - Java Şifreleme Uzantısı (JCE) sınırsız güç yetki politikası dosyalarını yükleme


1

bu sorunu çözmek için iki seçenek var

seçenek numarası 1: daha kısa uzunlukta RSA 2048 sertifikası kullanın

seçenek numarası 2:jre\lib\security java'yı kullandığınız her şeyde iki kavanoz güncellersiniz http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

ya da IBM websphere'i ya da java'sını kullanan herhangi bir uygulama sunucusunu kullanırsanız. kulakları websphere üzerinde dağıttığımda karşılaştığım en büyük sorun maksimum uzunlukta sertifika kullandım, aynı istisna atılır

Java Security: Illegal key size or default parameters?

web kavanozundaki java intsalled klasörünü iki kavanozla güncelledim https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

referansı https://www-01.ibm.com/support/docview.wss?uid=swg21663373 bağlantısından kontrol edebilirsiniz.



1

Varsayılan JDK şifrelemeyi yalnızca Amerikan kısıtlamaları nedeniyle 128 bit anahtarlarla destekler. Yani destek şifreleme 256 bit uzunluğunda anahtarından biz değiştirmek zorunda local_policy.jarve US_export_policy.jarsiçinde $JAVA_HOME/java-8-oracle/jre/lib/securityklasörün aksi takdirde verecektir:

java.security.InvalidKeyException: Geçersiz anahtar boyutu veya varsayılan


0

Oraya gitmelisin

/jdk1.8.0_152 | / jre | / lib | / güvenlik | java.security ve uncomment the

#crypto.policy=unlimited

için

crypto.policy=unlimited
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.