Java.Security.InvalidKeyException: tamaño de clave ilegal

Mehvish Ashiq 12 octubre 2023
  1. la java.security.InvalidKeyException: tamaño de clave ilegal en Java
  2. Posibles razones para java.security.InvalidKeyException: tamaño de clave ilegal
  3. Erradicar la java.security.InvalidKeyException: tamaño de clave ilegal
Java.Security.InvalidKeyException: tamaño de clave ilegal

Este tutorial presenta el código Java que contiene la excepción java.security.InvalidKeyException: Illegal key size. Luego, aprenderemos las posibles razones para ello.

Finalmente, nos lleva a la solución erradicando el error especificado.

la java.security.InvalidKeyException: tamaño de clave ilegal en Java

Código de ejemplo (clase App1.java):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {
  private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

  public String cryptAString(String str) {
    String ret = "";
    try {
      byte[] crypKeyData = this.crypKey.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "AES");
      Cipher cipher = Cipher.getInstance("AES");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException
        | UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException ex) {
      ex.printStackTrace();
    }
    return ret;
  }
}

La crypKey es la siguiente:

private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

La función anterior acepta un argumento de tipo cadena. Debería cifrar eso cuando ejecutamos este programa, pero nos da el error java.security.InvalidKeyException: Illegal key size.

¿Qué significa y cuáles son las razones? Veámoslo en el siguiente apartado.

Posibles razones para java.security.InvalidKeyException: tamaño de clave ilegal

Este error significa que nuestra máquina virtual Java (JVM) está utilizando una política que permite tamaños de clave criptográficos limitados solo debido a las leyes de exportación de EE. UU.

Ahora, el punto es, ¿por qué estamos recibiendo este error? A continuación se dan dos posibilidades.

  1. Primero, estamos usando un algoritmo que requiere encriptación de n-bits; si nos excedemos, obtendremos este error.
  2. Aún no hemos instalado el archivo de política de jurisdicción de fuerza ilimitada.

¿Qué son estos archivos? Estos archivos son extensiones criptográficas de Java (JCE) que permiten que las aplicaciones de Java obtengan la ventaja de la potente versión de algoritmos estándar.

Según la documentación de Java, las últimas versiones de Java Development Kit (JDK) no necesitan este tipo de archivos. Solo están obligados a utilizar una versión anterior de JDK.

La siguiente pregunta es, ¿qué archivo debemos instalar para qué versión de JDK? Aprendamos eso a continuación.

Java 9 y superior

Según actualizaciones de seguridad en la guía de migración de Java 9, los archivos de política de jurisdicción de fuerza ilimitada ya están incluidos en Java 9 y se usan de forma predeterminada.

Si queremos ejecutar una aplicación que requiere los archivos de política de jurisdicción de fuerza ilimitada JCE con versiones anteriores de JDK, entonces no tenemos que descargarlos e instalarlos con Java 9 o posterior. El motivo es que ya están incluidos y se utilizan de forma predeterminada.

Si todavía obtenemos este error mientras trabajamos con Java 9, las configuraciones de la política se cambian a la política más restrictiva (“limitada”). Pero eso no es un problema porque los archivos limitados de políticas criptográficas de Java están disponibles.

La segunda razón puede ser el uso de un algoritmo incorrecto al cifrar el argumento de tipo cadena proporcionado. A veces, los requisitos no se cumplen con los archivos de políticas proporcionados de forma predeterminada; en esa situación, podemos personalizar los archivos de política para satisfacer nuestras necesidades.

Para ello, verifique la propiedad de seguridad denominada crypto.policy en el archivo <java-home>/conf/security/java.security, o también podemos echar un vistazo a la Guía del desarrollador de seguridad de Java Platform, Standard Edition en Configuración de fuerza criptográfica.

Java 8 y anteriores

  1. Actualización de Java 8 161 y superior: a partir de Java 8 u161, Java 8 tiene por defecto una política de jurisdicción de fuerza ilimitada. Si aún obtenemos este error, la configuración se cambia a limitada.

    En el siguiente apartado veremos las instrucciones para cambiarlo a ilimitado.

  2. Actualización de Java 8 151 y superior: a partir de Java 8 u151, la política de jurisdicción de fuerza ilimitada se incluye en Java 8 pero no está activada de manera predeterminada.

    Para activarlo necesitamos editar nuestro archivo java.security que podemos encontrar en <java_home>/jre/lib/security (para JDK) o en <java_home>/lib/security (para JRE). Descomente/incluya la siguiente línea:

    crypto.policy = unlimited
    

    Asegúrese de editar este archivo usando un editor que se ejecute como administrador. No olvide reiniciar la Máquina Virtual Java porque la política solo tendrá efecto después de reiniciarla.

    Es particularmente necesario para los procesos de servidor de larga ejecución, por ejemplo, Tomcat. Teniendo en cuenta la compatibilidad con versiones anteriores, también funcionará seguir las instrucciones de la próxima sección para instalar archivos de política.

  3. Antes de la actualización 151 de Java 8: para Java 8 u144 y versiones anteriores, tenemos que instalar los archivos de política de jurisdicción de fuerza ilimitada de Java Cryptography Extension (JCE) que están disponibles en el sitio web oficial de Oracle.

Siga los pasos que se indican a continuación para instalar estos archivos:

  1. Descargue los archivos de política de jurisdicción de fuerza ilimitada de Java Cryptography Extension.

    Podemos ir aquí(https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html) y aquí(https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html) para descargar los archivos de política de jurisdicción de fuerza ilimitada de Java Cryptography Extension para Java 6 y 7, respectivamente.

  2. Descomprímalos y extráigalos al archivo descargado. Como resultado, se creará un subdirectorio llamado jce.

    Este directorio tendrá los siguientes archivos:

    README.txt
    local_policy.jar
    US_export_policy.jar
    
  3. Instalar una política de fuerza ilimitada archivos JAR. Recuerde, si queremos volver a una versión de política original fuerte pero limitada, entonces haga una copia de los archivos de política de Java Cryptography Extension originales (US_export_policy.jar y local_policy.jar).

  4. Reemplace los archivos de política “fuertes” con una versión de fuerza ilimitada que extrajimos en el paso anterior. Las ubicaciones estándar para los archivos JAR de la política de jurisdicción de Java Cryptography Extension son las siguientes:

    4.1 <java-home>/lib/security para el sistema operativo Unix.
    4.2 <java-home>\lib\security para el sistema operativo Windows.
    4.3 Para JDK, está en jre/lib/security.

Erradicar la java.security.InvalidKeyException: tamaño de clave ilegal

Código de ejemplo (clase App1.java):

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;

public class App1 {
  private String crypKey = "qkjll5@2md3gs5Q@FDFqf";

  public String cryptAString(String str) {
    String ret = "";
    try {
      byte[] crypKeyData = this.crypKey.getBytes();
      SecretKeySpec secretKeySpec = new SecretKeySpec(crypKeyData, "ARCFOUR");
      Cipher cipher = Cipher.getInstance("ARCFOUR");
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
      ret = new String(cipher.doFinal(str.getBytes("UTF-8")));

    } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException
        | UnsupportedEncodingException | BadPaddingException | IllegalBlockSizeException ex) {
      ex.printStackTrace();
    }
    return ret;
  }
}

Código de ejemplo (clase Test.java):

public class Test {
  public static void main(String[] args) {
    App1 app = new App1();
    String str = "ThisIsFoundation";
    String cryptedStr = app.cryptAString(str);
    System.out.println(cryptedStr);
    System.out.println(cryptedStr.chars().count());
  }
}

Imprimirá la cadena cifrada como ??c[D]???J??n? y el recuento es de 15 caracteres. ¿Cómo solucionamos esto?

Podemos deshacernos de InvalidKeyException de dos maneras.

  1. También podemos solucionarlo instalando archivos de políticas de Java Cryptography Extension (JCE) (todos los detalles se dan en la sección anterior).
  2. También podemos cambiar el nombre del algoritmo.

En nuestro caso, el problema se debe al tamaño de crypKey, que es mayor a 16 caracteres. Entonces, la clase Cipher no nos permite cifrar con un tamaño de clave de más de 128-bits (donde 128 bits == 16 Bytes == 16 Chars).

Por lo tanto, el valor de crypKey no puede exceder el límite de 16 caracteres.

Para exceder más de 16 caracteres, instalamos archivos de política JCE o actualizamos el nombre del algoritmo. Cambiaremos el nombre del algoritmo porque queremos mantener la restricción de tamaño de clave incorporada.

Entonces, actualizamos el nombre del algoritmo de AES a ARCFOUR. Es porque el algoritmo ARCFOUR se puede utilizar con varios tamaños de clave.

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

Artículo relacionado - Java Exception