InvalidKeyException Tamanho da chave ilegal

Eu tenho um teste que funciona muito bem no meu MacBook Pro de desenvolvimento, mas não consegue executar em servidor TeamCity de continuous integration.

O erro está seguindo:

java.security.InvalidKeyException: Illegal key size at javax.crypto.Cipher.a(DashoA13*..) at javax.crypto.Cipher.init(DashoA13*..) at javax.crypto.Cipher.init(DashoA13*..) 

Tanto a checkbox de desenvolvimento quanto o TeamCity usam o Java 1.6 e eu uso a biblioteca BouncyCastle para a necessidade de criptografia AES especial.

O código é o seguinte:

 private byte[] aesEncryptedInfo(String info) throws UnsupportedEncodingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidParameterSpecException, InvalidAlgorithmParameterException, NoSuchProviderException { Security.addProvider(new BouncyCastleProvider()); SecretKey secret = new SecretKeySpec(CUSTOMLONGSECRETKEY.substring(0, 32).getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(VECTOR_SECRET_KEY.getBytes())); return cipher.doFinal(info.getBytes("UTF-8")); } 

ATUALIZAR

Parece que, de acordo com a resposta selecionada, eu tenho que modificar algo na minha instalação do TeamCity e isso possivelmente afetará algumas instalações do usuário – por isso não é uma boa escolha eu tenho que mudar para outra biblioteca de criptografia para fazer isso sem limitações. Então provavelmente o castelo inflável vai ajudar.

ATUALIZAÇÃO 2

Na verdade, mudei para usar o BouncyCastle para evitar essa limitação. Observe que isso só funciona se você usar as próprias classs BC diretamente, não o provedor BC.

    Esse erro significa que sua máquina virtual Java usa uma política que permite apenas tamanhos restritos de chave de criptografia devido às leis de exportação dos EUA.

    Java 9 e superior

    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 (consulte Atualizações de Segurança no Guia de Migração do Java 9 ).

    Se você receber esse erro com o Java 9, isso pode significar que a configuração da política foi alterada para uma política mais restritiva ( limited ), consulte as instruções do guia de migration:

    O padrão do arquivo de política de jurisdição JCE é ilimitado

    Se o seu aplicativo exigiu anteriormente os Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia Java (JCE), você não precisará mais fazer o download ou instalá-los. Eles estão incluídos no JDK e são ativados por padrão.

    Se o seu país ou uso exigir uma política mais restritiva, os arquivos limitados de política criptográfica Java ainda estarão disponíveis.

    Se você tiver requisitos que não são atendidos por um dos arquivos de política fornecidos por padrão, poderá personalizar esses arquivos de políticas para atender às suas necessidades.

    Consulte a propriedade Security do /conf/security/java.security arquivo /conf/security/java.security ou Cryptographic Strength Configuration no Guia do desenvolvedor de segurança da plataforma Java, Standard Edition.

    Java 8 e anterior

    Java 8 Atualização 161 e superior

    Começando com o Java 8 Update 161, o Java 8 padroniza a Política de Jurisdição de Força Ilimitada. Se você receber esse erro, isso pode indicar que a configuração foi alterada para limited . Consulte as instruções na próxima seção sobre o Java 8, Atualização 151, ou a seção anterior sobre Java 9, para alterar isso de volta para unlimited .

    Java 8 Atualização 151 e superior

    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 (isso é especialmente importante para processos de servidor de longa execução, como o Tomcat).

    Para compatibilidade com versões anteriores, a instalação dos arquivos de políticas, conforme documentado na próxima seção, também funcionará.

    Antes do Java 8 Update 151

    Para o Java 8 Update 144 e anterior, é necessário instalar os Arquivos de Política de Jurisdição de Força Ilimitada da Extensão de Criptografia (JCE) do Java (disponíveis no Oracle ).

    Para instalar esses arquivos (do README.txt no download):

    1. Faça o download dos arquivos de política JCE de força ilimitada.

    2. Descompacte e extraia o arquivo baixado.

      Isto irá criar um subdiretório chamado jce. Este diretório contém os seguintes arquivos:

       README.txt This file local_policy.jar Unlimited strength local policy file US_export_policy.jar Unlimited strength US export policy file 
    3. Instale os arquivos JAR da política de força ilimitada.

      Caso você decida posteriormente reverter para as versões de política “fortes” originais, mas limitadas, primeiro faça uma cópia dos arquivos de política JCE originais (US_export_policy.jar e local_policy.jar). Em seguida, substitua os arquivos de políticas fortes pelas versões de força ilimitadas extraídas na etapa anterior.

      O local padrão dos arquivos JAR da política de jurisdição da JCE é:

       /lib/security [Unix] \lib\security [Windows] 

    Nota para o JDK está em jre / lib / security.

    O novo arquivo de políticas só entra em vigor após o reinício da JVM (isso é especialmente importante para processos de servidor de longa execução, como o Tomcat).

    Eu tive um problema semelhante, mas no meu caso, houve um erro de caminho.

    JAVA_HOME era jdk1.6.0_18, então coloquei os dois jars em jdk1.6.0_18/lib/security , mas dentro de jdk1.6.0_18 está o diretório jre . Ambos os arquivos devem ter sido colocados em jdk1.6.0_18/jre/lib/security .

    Além de instalar arquivos de política, também certifique-se de que CUSTOMLONGSECRETKEY...getBytes() fato produza uma matriz de 32 bytes. Eu usaria CUSTOMLONGSECRETKEY.getBytes(some encoding) e obteria 32 bytes a partir disso. Melhor ainda, use toda a chave secreta para obter chaves para o AES com o tamanho que você precisa.

    Verifique se você conhece o caminho para JAVA_HOME que seu IDE usa . Para copiar para o caminho correto.

    No meu caso eu uso o IntelliJ: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security

    Em vez de quando eu mostro o $ JAVA_HOME no console. /Users/myuser/.sdkman/candidates/java/current/jre/lib/security

    Eu estava enfrentando o mesmo problema para o jdk 1.8.0_151-

    Para essa e a versão anterior, você não precisa fazer o download dos arquivos jar relacionados a security.Because, local_policy.jar e US_export_policy.jar já está incluído nessas versões sob o path- \ jre \ lib \ security \ policy (JAVA_HOME refere-se a sua pasta de instalação do java atual) O único que você precisa fazer é no arquivo java.security que está presente em / jre / lib / security – descomente a linha – crypto.policy = unlimited