Tengo una aplicación que utiliza cifrado AES de 256 bits que Java no admite de inmediato. Sé que para que esto funcione correctamente, instalo los tarros de fuerza ilimitada JCE en la carpeta de seguridad. Esto está bien para mí como desarrollador, puedo instalarlos.
Mi pregunta es que, dado que esta aplicación se distribuirá, los usuarios finales probablemente no tendrán instalados estos archivos de políticas. Hacer que el usuario final los descargue solo para que la aplicación funcione no es una solución atractiva.
¿Hay alguna manera de hacer que mi aplicación se ejecute sin sobrescribir archivos en la máquina del usuario final? ¿Un software de terceros que pueda manejarlo sin los archivos de política instalados? ¿O una forma de hacer referencia a estos archivos de política desde un JAR?
fuente
Respuestas:
Hay un par de soluciones comúnmente citadas para este problema. Lamentablemente, ninguno de estos es completamente satisfactorio:
Pero luego está la reflexión. ¿Hay algo que no puedas hacer usando la reflexión?
Simplemente llame
removeCryptographyRestrictions()
desde un inicializador estático o similar antes de realizar cualquier operación criptográfica.La
JceSecurity.isRestricted = false
parte es todo lo que se necesita para usar cifrados de 256 bits directamente; sin embargo, sin las otras dos operaciones,Cipher.getMaxAllowedKeyLength()
seguirá reportando 128, y los conjuntos de cifrado TLS de 256 bits no funcionarán.Este código funciona en Oracle Java 7 y 8, y omite automáticamente el proceso en Java 9 y OpenJDK donde no es necesario. Al ser un truco feo después de todo, es probable que no funcione en las máquinas virtuales de otros proveedores.
Tampoco funciona en Oracle Java 6, porque las clases privadas de JCE están ofuscadas allí. Sin embargo, la ofuscación no cambia de una versión a otra, por lo que técnicamente es posible admitir Java 6.
fuente
final
campo en 8u111, lo modifiqué para que pueda cambiar el campo final, siguiendo esta respuesta . El resultado es casi el mismo que la nueva versión de ntoskrnl, excepto que no lo declaremodifiersField
comofinal
. Uno de mis usuarios informa que también funciona en 8u112.Esto ya no es necesario para Java 9 , ni para ninguna versión reciente de Java 6, 7 u 8. ¡Finalmente! :)
Según JDK-8170157 , la política criptográfica ilimitada ahora está habilitada de forma predeterminada.
Versiones específicas del tema JIRA:
Tenga en cuenta que si por alguna extraña razón se necesita el comportamiento anterior en Java 9, se puede configurar usando:
fuente
Aquí está la solución: http://middlesphere-1.blogspot.ru/2014/06/this-code-allows-to-break-limit-if.html
fuente
java.security.InvalidKeyException: Wrong algorithm: AES or Rijndael required
isRestricted
campo se ha convertido en final ( bugs.openjdk.java.net/browse/JDK-8149417 ). La respuesta de @ ntoskrnl se encarga de cualquier posible inclusión de un modificador "final". El comentario de @ M.Dudley sobre el Acuerdo de licencia de Java todavía se aplica también.Bouncy Castle todavía requiere frascos instalados por lo que puedo decir.
Hice una pequeña prueba y pareció confirmar esto:
http://www.bouncycastle.org/wiki/display/JA1/Frequency+Asked+Questions
fuente
A partir de JDK 8u102, las soluciones publicadas que dependen de la reflexión ya no funcionarán: el campo que estas soluciones establecen ahora
final
( https://bugs.openjdk.java.net/browse/JDK-8149417 ).Parece que ha vuelto a (a) usar Bouncy Castle o (b) instalar los archivos de política JCE.
fuente
isRestricted
campo, ya que se encarga de una posible adición de un modificador "final".Para una biblioteca de criptografía alternativa, eche un vistazo a Bouncy Castle . Tiene AES y mucha funcionalidad adicional. Es una biblioteca liberal de código abierto. Sin embargo, tendrá que usar la API ligera y patentada de Bouncy Castle para que esto funcione.
fuente
Podrías usar el método
para probar la longitud de la clave disponible, úsela e informe al usuario sobre lo que está sucediendo. Algo que indica que su aplicación está volviendo a las claves de 128 bits debido a que los archivos de políticas no se están instalando, por ejemplo. Los usuarios conscientes de la seguridad instalarán los archivos de políticas, otros continuarán usando claves más débiles.
fuente
Para nuestra aplicación, teníamos una arquitectura de servidor cliente y solo permitíamos descifrar / cifrar datos en el nivel del servidor. Por lo tanto, los archivos JCE solo se necesitan allí.
Tuvimos otro problema en el que necesitábamos actualizar un jar de seguridad en las máquinas cliente, a través de JNLP, sobrescribe las bibliotecas en
${java.home}/lib/security/
y la JVM en la primera ejecución.Eso lo hizo funcionar.
fuente
Aquí hay una versión actualizada de la respuesta ntoskrnl . Además contiene una función para eliminar el modificador final como Arjan mencionado en los comentarios.
Esta versión funciona con JRE 8u111 o posterior.
fuente
((Map<?, ?>) perms.get(defaultPolicy)).clear();
produce un error de compilación. Comentar no parece afectar su funcionalidad. ¿Es necesaria esta línea?Aquí hay una versión modificada del código de @ ntoskrnl con
isRestrictedCryptography
verificación por registro realCipher.getMaxAllowedKeyLength
, slf4j y soporte de inicialización singleton desde el arranque de la aplicación de esta manera:Este código detendrá correctamente la reflexión cuando la política ilimitada esté disponible por defecto en Java 8u162 como predice la respuesta de @ cranphin.
fuente
Durante la instalación de su programa, solo solicite al usuario y descargue un script de lote de DOS o un script de shell de Bash y copie el JCE en la ubicación correcta del sistema.
Solía tener que hacer esto para un servicio web de servidor y, en lugar de un instalador formal, solo proporcioné scripts para configurar la aplicación antes de que el usuario pudiera ejecutarla. Puede hacer que la aplicación no se pueda ejecutar hasta que ejecuten el script de configuración. ¿También puede hacer que la aplicación se queje de que falta el JCE y luego solicitar descargar y reiniciar la aplicación?
fuente