InvalidKeyException Tamaño de clave ilegal

Tengo una prueba que funciona muy bien en mi MacBook Pro de desarrollo, pero no se ejecuta en el servidor de integración continua de TeamCity.

El error es siguiente:

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 la caja de desarrollo como TeamCity usan Java 1.6 y yo uso la biblioteca BouncyCastle para la necesidad de encriptación AES especial.

El código es el siguiente:

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

ACTUALIZAR

Parece que, de acuerdo con la respuesta seleccionada, tengo que modificar algo en mi instalación de TeamCity y posiblemente afecte algunas instalaciones de usuarios, por lo que no es una buena opción. Tengo que cambiar a otra biblioteca de cifrado para hacerlo sin limitaciones. Entonces probablemente el castillo hinchable lo ayudará.

ACTUALIZACIÓN 2

De hecho, cambié para usar BouncyCastle para evitar esta limitación. Tenga en cuenta que esto solo funciona si utiliza clases BC propias directamente, no el proveedor BC.

    Este error significa que su máquina virtual Java usa una política que solo permite tamaños de clave de criptografía restringidos debido a las leyes de exportación de EE. UU.

    Java 9 y superior

    Los archivos de políticas de jurisdicción de fuerza ilimitada se incluyen con Java 9 y se usan de forma predeterminada (consulte Actualizaciones de seguridad en la Guía de migración de Java 9 ).

    Si obtiene este error con Java 9, puede significar que la configuración de la política se ha cambiado a una política más restrictiva ( limited ); consulte las instrucciones de la guía de migración:

    El valor predeterminado del archivo de la política de jurisdicción de JCE es ilimitado

    Si su aplicación anteriormente requería los archivos de la Política de Jurisdicción de Intensidad Ilimitada de Java Cryptography Extension (JCE), ya no necesita descargarlos ni instalarlos. Están incluidos en el JDK y se activan por defecto.

    Si su país o el uso requieren una política más restrictiva, los limitados archivos de la política criptográfica de Java aún están disponibles.

    Si tiene requisitos que no cumplen con ninguno de los archivos de política proporcionados por defecto, puede personalizar estos archivos de política para satisfacer sus necesidades.

    Consulte la propiedad de seguridad crypto.policy en el archivo /conf/security/java.security , o Configuración de fortaleza criptográfica en la plataforma Java, Guía de desarrollo de seguridad de Standard Edition.

    Java 8 y versiones anteriores

    Java 8 Update 161 y superior

    A partir de Java 8 Update 161, Java 8 adopta por defecto la Política de Jurisdicción de Fuerza Ilimitada. Si recibe este error, podría indicar que la configuración se ha cambiado a limited . Consulte las instrucciones en la siguiente sección sobre Java 8 Update 151, o la sección anterior en Java 9, para cambiar esto de nuevo a unlimited .

    Java 8 Update 151 y superior

    Comenzando con Java 8 Update 151, la Política de Jurisdicción de Fuerza Ilimitada se incluye con Java 8 pero no se usa por defecto. Para habilitarlo, debe editar el archivo java.security en /jre/lib/security (para JDK) o /lib/security (para JRE). Descomenta (o incluye) la línea

     crypto.policy=unlimited 

    Asegúrese de editar el archivo usando un editor ejecutado como administrador.

    El cambio de política solo tiene efecto después de reiniciar la JVM (esto es especialmente importante para los procesos de servidor de larga ejecución como Tomcat).

    Para compatibilidad con versiones anteriores, la instalación de los archivos de políticas como se documenta en la siguiente sección también funcionará.

    Antes de Java 8 Update 151

    Para la actualización 144 de Java 8 y versiones anteriores, debe instalar los archivos de política de jurisdicción de fuerza ilimitada (JCE) de Java Cryptography Extension (disponibles en Oracle ).

    Para instalar estos archivos (desde README.txt en la descarga):

    1. Descargue los archivos de política de JCE de fuerza ilimitada.

    2. Descomprime y extrae el archivo descargado.

      Esto creará un subdirectorio llamado jce. Este directorio contiene los siguientes archivos:

       README.txt This file local_policy.jar Unlimited strength local policy file US_export_policy.jar Unlimited strength US export policy file 
    3. Instale los archivos JAR de política de fuerza ilimitada.

      En caso de que más adelante decida volver a las versiones de política “fuertes” pero limitadas originales, primero haga una copia de los archivos de políticas originales de JCE (US_export_policy.jar y local_policy.jar). Luego reemplace los sólidos archivos de políticas con las versiones de fuerza ilimitada extraídas en el paso anterior.

      El lugar estándar para los archivos JAR de política de jurisdicción de JCE es:

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

    Nota para el JDK está en jre / lib / security.

    El nuevo archivo de política solo tiene efecto después de reiniciar la JVM (esto es especialmente importante para los procesos de servidor de larga ejecución como Tomcat).

    Tuve un problema similar, pero en mi caso, hubo un error de ruta.

    JAVA_HOME era jdk1.6.0_18, así que puse los dos jdk1.6.0_18/lib/security en jdk1.6.0_18/lib/security , pero dentro de jdk1.6.0_18 está el directorio jre . Ambos archivos deberían haberse puesto en jdk1.6.0_18/jre/lib/security .

    Además de instalar los archivos de políticas, asegúrese también de que CUSTOMLONGSECRETKEY...getBytes() produzca una matriz de 32 bytes. Yo usaría CUSTOMLONGSECRETKEY.getBytes(some encoding) y obtendría los primeros 32 bytes de eso. Mejor aún, use la clave secreta completa para derivar claves para AES con el tamaño que necesita.

    Asegúrese de conocer la ruta a JAVA_HOME que usa su IDE . Para copiar a la ruta correcta.

    En mi caso uso IntelliJ: /Library/Java/JavaVirtualMachines/jdk1.8.0_112.jdk/Contents/Home/jre/lib/security

    En lugar de mostrar el $ JAVA_HOME en la consola. /Users/myuser/.sdkman/candidates/java/current/jre/lib/security

    Estaba enfrentando el mismo problema para jdk 1.8.0_151-

    Para esta y la versión anterior, no es necesario que descargue los archivos jar relacionados con la seguridad. Porque, local_policy.jar y US_export_policy.jar ya están incluidos en estas versiones en la ruta de acceso \ jre \ lib \ security \ policy (JAVA_HOME hace referencia a su actual carpeta de instalación java) La única chng que necesita hacer es en el archivo java.security que está presente en / jre / lib / security – descomente la línea – crypto.policy = unlimited