Segurança Java: tamanho de chave ilegal ou parâmetros padrão?

Eu tinha feito uma pergunta sobre isso antes, mas não foi respondida corretamente e levou a lugar nenhum.

Então, eu esclareci alguns detalhes sobre o problema e gostaria de ouvir suas idéias sobre como eu poderia corrigir isso ou o que eu deveria tentar.

Eu tenho o Java 1.6.0.12 instalado no meu servidor Linux e o código abaixo é executado perfeitamente.

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

Hoje eu instalei o Java 1.6.0.26 no meu usuário servidor e quando tento executar meu aplicativo, recebo a seguinte exceção. Meu palpite é que isso tem algo a ver com a configuração da instalação do Java porque funciona na primeira, mas não funciona na versão posterior.

 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 

A linha 25 é: c.init(Cipher.DECRYPT_MODE, secretKeySpec);

Notas:
* java.security no diretório java 1.6.0.12 do servidor corresponde quase completamente ao arquivo java.security 1.6.0.26 . Não há provedores adicionais no primeiro.
* A pergunta anterior está aqui .

   

Muito provavelmente você não tem o arquivo de força ilimitado instalado agora.

Você pode precisar baixar este arquivo:

Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia Java (JCE) 6

Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia Java (JCE) 7 Download

Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia Java (JCE) 8 Download

Extraia os arquivos jar do zip e salve-os em ${java.home}/jre/lib/security/ .

Os arquivos de jurisdição do JRE / JDK / Java 8 podem ser encontrados aqui:

Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia Java (JCE) 8 Download

Como James disse acima:
Instale os arquivos em ${java.home}/jre/lib/security/ .

Para o JAVA 7, o link de download é jce-7-download

Copie os dois jars baixados em Java \ jdk1.7.0_10 \ jre \ lib \ security
Faça um backup de jarros mais antigos para estar no lado mais seguro.

Para o JAVA 8, o link de download é jce-8-download
Copie os jars baixados em Java \ jdk1.8.0_45 \ jre \ lib \ security
Faça um backup de jarros mais antigos para estar no lado mais seguro.

Esta é uma solução somente de código . Não há necessidade de baixar ou mexer nos arquivos de configuração.

É uma solução baseada em reflection, testada em java 8

Chame esse método uma vez, no início do seu programa.

// Importações

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

//método

 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 } 

Créditos: Delthas

Com Java 9, Java 8u161 , Java 7u171 e Java 6u181, a limitação agora está desabilitada por padrão. Veja o problema no Java Bug Database .


Começando com o Java 8u151, você pode desativar a limitação programaticamente.

Em versões mais antigas, os arquivos de jurisdição da JCE precisavam ser baixados e instalados separadamente para permitir que criptografia ilimitada fosse usada pelo JDK. As etapas de download e instalação não são mais necessárias.

Em vez disso, você pode invocar a seguinte linha antes do primeiro uso das classs JCE (ou seja, de preferência logo após o início do aplicativo):

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

“Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia Java (JCE) 6”

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

Em Java, por padrão, o AES suporta uma chave de 128 bits, se você planeja usar a chave de 192 bits ou 256 bits, o compilador java lançará a exceção de tamanho de chave ilegal, que você está obtendo.

A solução é tão vitoriosa & James sugeriu, você precisará baixar JCE (Java Cryptography Extension) como por sua versão do JRE, (java6, java7 ou java8).

O zip JCE contém o seguinte JAR:

  1. local_policy.jar
  2. US_export_policy.jar

Você precisa replace o jarro /jre/lib/security . se você estiver em um sistema unix, provavelmente irá se referir a /home/urs/usr/lib/jvm/java--oracle/

Às vezes, apenas substituindo local_policy.jar, US_export_policy.jar na pasta de segurança não funciona em unix, então sugiro que primeiro copie a pasta de segurança para sua área de trabalho, substitua a pasta @ Desktop / security do jar, exclua a pasta de segurança de / jre / lib / & mova a pasta de segurança do Desktop para / jre / lib /.

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

Eu tive o mesmo erro ao usar o Windows 7 x64, o Eclipse e o JDK 1.6.0_30. Na pasta de instalação do JDK, há uma pasta jre . Isso me desencorajou no início, já que eu estava adicionando os flasks acima mencionados à pasta lib / security do JDK sem sorte. Caminho completo:

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

Baixe e extraia os arquivos contidos na pasta jce deste arquivo para essa pasta.

o problema é o conteúdo do arquivo default_local.policy em local_policy.jar na pasta jre \ lib \ security , se você instalar o 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; }; 

Se você não precisa de configurações válidas em todo o mundo, basta editar esse arquivo e alterar o conteúdo para

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

isso é o que acontece se você baixar o JCE da Oracle.

Há uma breve discussão sobre o que parece ser esse problema aqui . A página a que ele se liga parece ter desaparecido, mas uma das respostas pode ser o que você precisa:

De fato, copiar US_export_policy.jar e local_policy.jar do core / lib / jce para $ JAVA_HOME / jre / lib / security ajudou. Obrigado.

Eu também recebi o problema, mas depois de replace o existente com o baixado (da JCE) resolvi o problema. Novos arquivos criptocharts forneceram força ilimitada.

Por padrão, o Java suporta apenas tamanhos de chave AES de 128 bits (16 bytes) para criptografia. Se você não precisar mais do que o padrão suportado, poderá recortar a chave no tamanho adequado antes de usar a Cipher . Veja javadoc para as chaves suportadas padrão.

Este é um exemplo de geração de uma chave que funcionaria com qualquer versão da JVM sem modificar os arquivos de política. Use a seu próprio critério.

Aqui está um bom artigo sobre se os principais tamanhos de chaves de 128 a 256 são importantes no AgileBits Blog

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

O JDK padrão suporta criptografia somente através de chaves de 128 bits, devido às restrições americanas. Portanto, para dar suporte à criptografia a partir da chave longa de 256 bits, temos que replace o local_policy.jar e o US_export_policy.jars na US_export_policy.jars $JAVA_HOME/java-8-oracle/jre/lib/security caso contrário ele fornecerá:

java.security.InvalidKeyException: tamanho da chave ilegal ou padrão

Ambos os flasks e conceito detalhado podem ser entendidos a partir do link:

easybook4u.com

A partir do Java 9 ou 8u151, você pode usar o comentário de uma linha no arquivo:

 /jre/lib/security/java.security 

E mude:

 #crypto.policy=unlimited 

para

 crypto.policy=unlimited 

Existem duas opções para resolver este problema

opção número 1: use certificado com menos comprimento RSA 2048

opção número 2: você atualizará dois jars em jre\lib\security independentemente do que usar java http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

ou você usa o IBM websphere ou qualquer servidor de aplicativos que use seu java. o principal problema que eu enfrentei eu usei a certificação com o comprimento máximo, quando eu implantado ouvidos no websphere a mesma exceção é lançada

 Java Security: Illegal key size or default parameters? 

Eu atualizei a pasta java intsalled no websphere com dois flasks https://www14.software.ibm.com/webapp/iwm/web/reg/pick.do?source=jcesdk&lang=en_US

você pode verificar a referência no link https://www-01.ibm.com/support/docview.wss?uid=swg21663373

Se você estiver usando a distribuição do Linux com o apt e tiver adicionado o webupd8 PPA, você pode simplesmente executar o comando

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

Outras atualizações:

  1. Os Arquivos de Política de Jurisdição de Força Ilimitada estão incluídos no Java 9 e são usados ​​por padrão
  2. Começando com o Java 8 Update 161 , o Java 8 padroniza a Política de Jurisdição de Força Ilimitada.
  3. A partir da Atualização 151 do Java 8 , a Política de Jurisdição de Força Ilimitada está incluída no Java 8, mas não é usada por padrão. Para ativá-lo, você precisa editar o arquivo java.security em /jre/lib/security (para JDK) ou em /lib/security (para JRE). Descomente (ou inclua) a linha

    crypto.policy=unlimited

    Certifique-se de editar o arquivo usando um editor executado como administrador. A mudança de política só entra em vigor após o reinício da JVM

Antes que o Java 8 Update 151 restante das respostas mantenha válida. Download JCE Unlimited Strength Jurisdiction Policy Files e substitua.

Como instalar arquivos de políticas de jurisdição de força ilimitada do Java Cryptography Extension (JCE)