una software que programacion para ofuscar ofuscación ofuscacion licencia desofuscar descompilar crear como codigo archivo java sqlite encryption jar

java - software - ofuscar en programacion



¿Cómo crear un archivo jar encriptado? (6)

Kosi2801 está más o menos en lo cierto. Lo único que puedo pensar que podrías hacer es lo siguiente, pero es feo.

  1. Envíe un pequeño JAR estándar y un archivo de datos encriptados.
  2. Cuando se ejecuta el JAR, descifra (algunos) del archivo de datos cifrados en la memoria (como el directorio donde están los datos en el JAR, básicamente un sistema de archivos en memoria simple de pares de puntero / longitud)
  3. Configure su propio cargador de clases que, cuando se le llame, obtenga los bytes cifrados correctos del JAR (utilizando la tabla pseudo-FS descrita en el n. ° 2), los descifra y luego carga los datos de la clase desde allí.

Esto te permitirá cargar las clases. Podría hacer lo mismo (sin el cargador de clases) para cargar otros recursos.

Si bien es divertido de implementar (para aquellos que les gusta un desafío) hay algunos problemas con esto:

  1. Tendría que ser capaz de descifrar las cosas, por lo que el usuario tendría que ingresar una contraseña cada vez o algo similar. Si el JAR sabe lo suficiente como para descifrarlo, cualquiera puede verlo y descubrir cómo descifrar las cosas. Esto podría mitigarse poniéndose en contacto con un servidor conocido por Internet para solicitar la clave de descifrado (siempre que asegure ese proceso). Por supuesto, esto requiere una conexión de red activa cada vez que alguien quiera ejecutar el programa.
  2. Todo termina en la memoria . Sin una JVM personalizada que maneje bits diminutos de código de bytes cifrados (como lo mencionó Cameron McKay) las clases terminarán descifradas en algún momento en la memoria principal. A menos que confíe en el sistema operativo para evitar que otras personas lean ese recuerdo, ya habrá perdido la batalla contra cualquiera con un poco de tiempo en sus manos. El mismo problema para los recursos (como imágenes / fuentes / etc.) que intenta leer de alguna tienda cifrada.

Así que puedes darles la vuelta a la gente y hacer las cosas más difíciles, pero en la situación que has dado, todo lo que puedes hacer es intentar que no valga la pena el tiempo que la otra persona tendrá que invertir.

La protección del software es difícil, especialmente en algo como Java que puede descompilarse fácilmente y no puede alterar su propio código como lo haría C / Assembly. Existe una razón por la que algunos de los programas más costosos requieren dongles de hardware o están bloqueados en una CPU u otro hardware determinado.

Estoy trabajando en proyectos que deben proteger los archivos de datos (revelar el código no es el problema principal). Estamos usando Java + Netbeans. ¿Hay alguna instalación que creará jar en formato encriptado? También estamos usando sqlite para la base de datos, por lo que poner archivos de texto en formato encriptado tampoco es una opción adecuada para nosotros.


No es posible crear JAR cifrados, ya que la ejecución de JavaVM debe poder leer de alguna manera los datos que quiere ejecutar. Y similar a una VM, cualquiera con las herramientas y los conocimientos técnicos adecuados podría extraer todos los datos del JAR.

Si fuera posible encriptar el JAR, también tendría que proporcionar alguna clave de descifrado o facilidad al cliente que desea ejecutar el JAR, lo que anula el objetivo del cifrado.

Lo mejor que puedes obtener es ofuscación, pero eso no es una seguridad real ni un obstáculo para el atacante ambicioso.


Otra opción sería crear una JVM personalizada que descifrara el JAR sobre la marcha. Pero el mismo problema persiste: en algún momento, las clases JAR Java deben descifrarse para que la JVM las ejecute, y en ese punto pueden capturarse y descompilarse.

Sin mencionar que tener una JVM personalizada requeriría que todos tus usuarios descargaran esa JVM también.


Puede usar CipherOutputStream y CipherInputStream para serializar objetos Java en un disco en formato cifrado. Esto puede ser una opción abierta para guardar datos.


En general, no hay forma de hacerlo de forma segura, si desea que la aplicación y sus datos sean independientes. Sin embargo, ciertamente puede encriptar los archivos y definirlos con una clave enterrada en el código. Un hacker determinado puede obtenerlo, pero si eso no es lo que le preocupa, entonces está bien. Si hace esto, recuerde que los datos cifrados no se pueden comprimir, por lo tanto, comprima primero y luego encripte.

Si realmente necesita que los datos sean seguros (por ejemplo, datos confidenciales), tendrá que encriptar los datos con una clave y proporcionar esa clave a la aplicación por algún medio externo, como ponerlo en una unidad de disco óptico y llevarlo a la usuario mediante un servicio de mensajería seguro.

Otra posibilidad es hacer que los datos (o la clave) estén disponibles a través de SSL, y usar un buen método de autenticación para verificar quién es su usuario.

En general, no es posible que un sistema sea perfectamente seguro, pero tampoco es necesario. Un sistema solo necesita ser lo suficientemente seguro como para desalentar a los atacantes que crees que tratarán de descifrar.


Estoy de acuerdo con Kosi2801. El cifrado de archivos de clase es solo una imitación de la seguridad (consulte http://www.excelsior-usa.com/articles/java-obfuscators.html ). El uso de ClassLoader personalizado puede romper la aplicación, por ejemplo, en Servidores de aplicaciones.

Existe la mejor manera: use el cifrado de las constantes de cadena en los archivos de una clase. La mayoría de los ofuscadores comerciales tienen esta función, por ejemplo Allatori , Stringer Java Obfuscation Toolkit , Zelix KlassMaster , Smokescreen , DashO (super caro). Stringer Java Obfuscator tiene control de contexto de llamada y funciones de control de integridad que hacen que la protección sea realmente difícil de hackear.

La forma más segura es almacenar y ejecutar partes de bytecode en un dispositivo externo como JavaCard.

NB Soy CEO en Licel LLC. Desarrollador de Stringer Java Obfuscator.