Java.Security.InvalidKeyException: tamaño de clave ilegal
-
la
java.security.InvalidKeyException: tamaño de clave ilegal
en Java -
Posibles razones para
java.security.InvalidKeyException: tamaño de clave ilegal
-
Erradicar la
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.
- Primero, estamos usando un algoritmo que requiere encriptación de
n-bits
; si nos excedemos, obtendremos este error. - 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
-
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
. -
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
(paraJDK
) o en<java_home>/lib/security
(paraJRE
). 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.
-
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:
-
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.
-
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
-
Instalar una política de fuerza ilimitada archivos
JAR
. Recuerde, si queremos volver a una versión de política originalfuerte
perolimitada
, entonces haga una copia de los archivos de política de Java Cryptography Extension originales (US_export_policy.jar
ylocal_policy.jar
). -
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 ParaJDK
, está enjre/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.
- También podemos solucionarlo instalando archivos de políticas de Java Cryptography Extension (
JCE
) (todos los detalles se dan en la sección anterior). - 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.
Artículo relacionado - Java Exception
- Arreglar Java.Net.SocketException: error de tubería rota en Java
- Clase de excepción Java Throwable VS
- Comprender la excepción de tiempo de ejecución en Java
- Corrija la excepción Java.Net.BindException: la dirección ya está en uso: Bind
- El proceso de Java Gateway se cerró antes de enviar su número de puerto
- Excepción de entrada no válida en Java