Lo sé, se han hecho muchas preguntas similares aquí. No estoy preguntando si puedo proteger mi clase compilada de Java, porque obviamente dirá 'no, no puede'. Me pregunto cuál es el método más conocido para proteger las clases de Java contra la descompresión. Si conoce algún trabajo de investigación o académico en este campo, hágamelo saber. Además, si ha usado algunos métodos o software, ¿comparta su experiencia? Cualquier tipo de información será muy útil. Gracias.¿Cómo proteger las clases compiladas de Java?
Respuesta
En primer lugar, si usted está apuntando "sólo" el mercado de Windows hay una muy fácil de prevenir las ".class a .JAVA" descompilación: utilizar una herramienta como Excelsior Jet que transformará el .jar en un . exe.
Esta es infalible: es imposible para obtener el archivo .java regreso si utiliza Excelsior Jet (siempre y para todo el pueblo diciendo "es imposible impedir la descompilación de un archivo .class "). Sin duda, un atacante podría lanzar SoftIce y tratar de rastrear su .exe, pero que será un poco más complicado que el uso de JAD para descompilar el .class a un .javay ciertamente no permitirá encontrar el archivo .java.
Ahora quizás esté apuntando a OS X y Linux también o no tiene $$$ para despedirse de Excelsior Jet.
Estoy escribiendo un software comercial escrito en Java. Ese software solo tiene sentido si hay una conexión a Internet. Por lo tanto, "protegemos" nuestro software, entre otros, teniendo parte de la computación en el lado del servidor: tenemos varios .class que no funcionarán a menos que se generen desde el lado del servidor y los enviemos por el cable (y lo que se envía por el cable es siempre diferente: estamos generando archivos únicos .class en el lado del servidor).
Esto requiere una conexión a Internet, pero si el usuario no le gusta cómo nuestro software funciona entonces él es libre de comprar un producto inferior de nuestro competidor;)
Descompilación no va a hacer mucho bien: se necesita activamente para romper el software (es decir, reproducir lo que está sucediendo en el lado del servidor) o no podrá usarlo.
Usamos nuestra propia "ofuscación de cadena" antes de usamos Proguard. También hacemos instrumentación de código fuente (podríamos haber hecho también una instrumentación bytecode) donde eliminamos muchas cosas del código (como el "assert" que comentamos) e introducimos una "ofuscación de flujo de código" al azar [el software puede tomar diferentes caminos aún obtienen el mismo resultado, esto es algo que realmente hace que el software sea difícil de rastrear]).
Luego usamos Proguard (que es gratis) para aplanar toda nuestra jerarquía OO y ofuscar el código ya-código-flujo-y-cadena-ofuscado.
Así que nuestro flujo es:
- ofuscación cadena
- ofuscación de código aleatorio flujo
- Proguard
- última .jar que depende de .class que están (diferente) genera dinámicamente en el lado del servidor.
Además de eso lanzamos actualizaciones muy regulares (y automáticas) que siempre aseguran modificar un poco nuestro esquema de protección cliente/servidor (para que con cada lanzamiento un atacante hipotético tenga que comenzar desde cero).
Por supuesto que es más fácil tirar la toalla y pensar: "no hay nada que pueda hacer para que la vida de un atacante más difícil porque JAD puede encontrar de vuelta el archivo .java todos modos" (que es más que muy discutible y abiertamente incorrecto en el caso donde usted usa un convertidor .class to .exe para proteger su clase de decompilación).
Dudo que sea una prueba infalible, aunque yo mismo estoy usando Launch4J para envolver un frasco dentro de un exe. Creo que con la correcta comprensión de la estructura de archivos exe y la asistencia de Launch4J, es posible realizar ingeniería inversa. Por supuesto, será mucho más difícil que usar el decompilador de Java. –
Tengo una pequeña corrección: Excelsior JET está disponible para Windows y Linux. –
@Yan Cheng CHEOK: Excelsior JET no es un envoltorio alrededor de .jar: está transformando su bytecode de Java en un ejecutable nativo de Windows (o Linux). Entonces, no es "infalible" en eso, seguro, las personas aún pueden intentar descompilarlo. Pero no hay forma * de recuperar el archivo .java que permite compilar .class (porque ya no hay archivos .class, ya no hay bytecode, todo es .exe nativo [o ejecutable Linux]). Esto no es en absoluto como un envoltorio como izpack o Launch4J etc. – SyntaxT3rr0r
Un ofuscador (ver http://java-source.net/open-source/obfuscators) "codificará" el código de modo que no tendrá ningún sentido cuando se descompile.
Existen varios métodos:
- ofuscación
- cifrado de software (flawed)
- cifrado de hardware (nearly unbreakable but the performance hit is huge)
- La compilación nativa
todas describe en detalle en mi artículo Protect Your Java Code - Through Obfuscators And Beyond
Entonces, ¿cómo puedes proteger tus clases para que no sean decompiladas? Una respuesta es Crema. Crema codifica la información simbólica en sus archivos .class para que sean menos vulnerables a la descompilación. La información simbólica que Crema codifica incluye el nombre de la clase, su superclase, interfaces, nombres de variables, métodos, etc. La máquina virtual Java (JVM) necesita estos nombres simbólicos para vincular sus clases con los paquetes de la biblioteca. Crema codifica estos nombres simbólicos y hace referencias a ellos de la misma manera para que la JVM aún pueda lograr la vinculación correcta entre las clases y los paquetes.
Entonces, ¿cómo funciona Crema? Básicamente, antes de distribuir sus archivos de clase en Internet, ejecute Crema en ellos. Crema codificará la información simbólica contenida en ellos, y colocará cada nueva clase en el archivo 1.crema. Su trabajo entonces es renombrar 1.crema a algo como filename.class antes de distribuirlo en Internet.
Puede probar el Java Protector. Es una mejor manera que la ofuscación. Hace un Native ClassLoader al modificar la fuente de OpenJDK, puede encriptar las clases que desea proteger por AES y analizarlas en su JRE personalizado. Puede publicar su software con el JRE y distribuirlo su seguridad de software.
- 1. java clases compiladas contienen signos de dólar
- 2. ¿Puedes llamar a las clases JRuby compiladas desde Java?
- 3. Cómo "proteger" las llamadas AJAX?
- 4. Cómo distribuir aplicaciones compiladas "estáticamente compiladas" con dependencias
- 5. ¿Cómo puedo proteger mi aplicación web java?
- 6. ¿Cómo instrumentar las clases del sistema Java?
- 7. Cómo proteger las clases para que no sean visibles fuera de su paquete
- 8. ¿Cómo usar las bibliotecas compiladas con MingW en MSVC?
- 9. ¿Las clases de Java son objetos?
- 10. Ventaja de las clases locales Java
- 11. cómo encontrar clases de Java?
- 12. ¿Las clases Java más interesantes/útiles?
- 13. Java: variables finales en las clases abstractas
- 14. ¿Cómo busca Java eficientemente los archivos jar para las clases?
- 15. java package cycle detection: cómo encontrar las clases específicas involucradas?
- 16. java cómo usar las clases en otro paquete?
- 17. ¿Cómo se compilan las clases anónimas en Java?
- 18. ¿Cómo usar las clases PrintWriter y File en Java?
- 19. Cómo proteger .NET DLL's
- 20. Cómo agregar nuevas clases de Java a las clases existentes en el archivo jar
- 21. Cómo proteger WebFonts
- 22. Acceso a las rutas compiladas en Grape/Rack :: Mount :: Route
- 23. Cómo proteger un servicio web REST en Java EE 6
- 24. Cómo bloquear un método java para proteger múltiples invocaciones
- 25. Mejora de las clases de Java utilizando rasgos, ¿cómo declarar dentro de los campos Java?
- 26. Cómo proteger Elmah.axd?
- 27. Cómo proteger CouchDB
- 28. Cómo proteger dlls?
- 29. Cómo proteger "." ¿carbonizarse?
- 30. Java: ¿Por qué son necesarias las clases de contenedor?
Pregunta similar a la tuya - http: // stackoverflow.com/questions/49379/how-to-lock-compiled-java-classes-to-prevent-decompilation –
¿Está interesado en evitar la descompilación o proteger sus secretos comerciales incrustados en el código? – Yuval
@ Yuval - Estoy interesado en ambos ... –