Foros del Web » Programación para mayores de 30 ;) » Java »

Como se hace para asegurar tu código java

Estas en el tema de Como se hace para asegurar tu código java en el foro de Java en Foros del Web. Hola a todos, en esta oportunidad les quiero hacer una pregunta: ¿Como se hace para evitar que tu .jar creado por netbeans, te lo copien ...
  #1 (permalink)  
Antiguo 20/02/2012, 11:29
Avatar de venezolana32  
Fecha de Ingreso: septiembre-2009
Mensajes: 71
Antigüedad: 15 años, 1 mes
Puntos: 3
Pregunta Como se hace para asegurar tu código java

Hola a todos, en esta oportunidad les quiero hacer una pregunta:

¿Como se hace para evitar que tu .jar creado por netbeans, te lo copien y lo vendan con otro nombre?

Ya tengo listo un sistema de auditoria con sus reportes realizados con iReport y JasperReport, y es una aplicación de escritorio. Al generar el .jar lo que hago es crear un instalador con innoSetup. Pero con todo esto me surgió la duda que plantee al principio, ya que el .jar queda instalado en la maquina, y cualquier persona con un mínimo de conocimiento de Java le puede cambiar el nombre y lo puede comercializar.

¿Sera que existe la posibilidad de crearle un serial a mi programa .jar?

Gracias por su colaboracion, espero haberme explicado bien.
  #2 (permalink)  
Antiguo 20/02/2012, 18:45
 
Fecha de Ingreso: agosto-2011
Ubicación: Madrid
Mensajes: 185
Antigüedad: 13 años, 2 meses
Puntos: 29
Respuesta: Como se hace para asegurar tu código java

Puedes almacenar cifrado algún valor del pc en donde lo vayas a instalar que no varíe (dirección MAC, etc), y cada vez que inicias tu programa compruebas que el valor sea el mismo. Es lo que se me ocurre así en "sucio". Supongo que habrá decenas de formas de hacerlo mejor.
  #3 (permalink)  
Antiguo 21/02/2012, 13:25
Avatar de venezolana32  
Fecha de Ingreso: septiembre-2009
Mensajes: 71
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Como se hace para asegurar tu código java

¡¡¡¡¡¡Gracias por esta valiiiosiisima idea, muy buena!!!!!!!

Mi pregunta ahora es la siguiente, y perdona mi ignorancia, pero como puedo obtener esta direccion MAC en Java??
  #4 (permalink)  
Antiguo 21/02/2012, 13:27
 
Fecha de Ingreso: agosto-2011
Ubicación: Madrid
Mensajes: 185
Antigüedad: 13 años, 2 meses
Puntos: 29
Respuesta: Como se hace para asegurar tu código java

En google encontrarás muchas páginas. Una cualquiera con la solución es esta:

http://ingenieriadesistemas.wordpres...l-pc-con-java/
  #5 (permalink)  
Antiguo 21/02/2012, 17:14
Avatar de venezolana32  
Fecha de Ingreso: septiembre-2009
Mensajes: 71
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Como se hace para asegurar tu código java

Gracias, ya lo puede ejecutar y me da la dirección MAC que necesito.

Ahora voy a hacer un resumen haber si entendí:

Lo que tengo que hacer es buscar el valor de la Direccion Mac del Pc en donde lo voy a instalar, guardo esta variable en la clase por decir algo SERIAL, y comparo estos dos valores, si coinciden se ejecuta el software de lo contrario no. ¿Cierto?
  #6 (permalink)  
Antiguo 21/02/2012, 17:21
 
Fecha de Ingreso: agosto-2011
Ubicación: Madrid
Mensajes: 185
Antigüedad: 13 años, 2 meses
Puntos: 29
Respuesta: Como se hace para asegurar tu código java

Deberías guardar esa dirección MAC en tu base de datos y sobre todo cifrado, para que no pueda modificarlo otra persona así sin más, en texto plano. La primera vez que se ejecute tu programa la almacenará, y en las siguientes ejecuciones comprobaría que el valor actual de la MAC sea igual al que tu tenías almacenado.

En el link que te pasé venía para obtener la dirección MAC de varios sistemas operativos. Si tienes la seguridad de que sólo se va a ejecutar en un SO puedes quitarte bastante código de ahí.
  #7 (permalink)  
Antiguo 01/03/2012, 12:25
Avatar de venezolana32  
Fecha de Ingreso: septiembre-2009
Mensajes: 71
Antigüedad: 15 años, 1 mes
Puntos: 3
Exclamación Respuesta: Como se hace para asegurar tu código java

Hola jav_000, aqui te dejo el codigo que realice. Te explico , el codigo toma la direccion MAC de la PC en donde instalo la Aplicacion, luego guardo este valor en la base de datos. Valido si en la base de datos el campo id esta vacio entonces, se guarda el valor, la segunda validacion se da cuando este campo tiene un valor guardado, entonces comparo el valor MAC del PC con el valor que tengo guardado en la base de datos si coincide ,mando por ejm un mensaje diciendo "PC CORRECTA", pero esta sentencia no le ejecuta ¿Que estara pasando?

GRACIAS POR TU AYUDA!!!

Código PHP:

public class serial2 {
public 
String MAC;

public static 
void main(String[] args){

    
ConexionMysql2 mysql = new ConexionMysql2();
    
Connection cn mysql.Conectar();
        
InetAddress ip;
    try {

        
ip InetAddress.getLocalHost();
        
System.out.println("Current IP address : " ip.getHostAddress());

        
NetworkInterface network NetworkInterface.getByInetAddress(ip);

        
byte[] mac network.getHardwareAddress();


                
System.out.print("Current MAC address : ");

        
StringBuilder sb = new StringBuilder();
        for (
int i 0mac.lengthi++) {
            
sb.append(String.format("%02X%s"mac[i], (mac.length 1) ? "-" ""));
        }
        
System.out.println(sb.toString());
                
String MAC sb.toString();
                
JOptionPane.showMessageDialog(null,"la direccion MAC es "+MAC );

                
String Ssql "";
                
Ssql "SELECT * FROM config";
                
String A" ";
                try
                  {
                    
Statement stt cn.createStatement();
                    
ResultSet rss stt.executeQuery(Ssql);
                      while (
rss.next())
                          {
                            
rss.getString("id");
                            
JOptionPane.showMessageDialog(null," direccion mac de la BD " +A);// BORRAR CUANDO ESTE TODO BIEN
                          
}
                  }
                catch (
SQLException ex)
                 {
                    
JOptionPane.showMessageDialog(nullex);
                 }

                if ( 
== " " )
                 {
                   
String sSqL"";
                   
sSqL "INSERT INTO config (id) VALUES(?)";
                      try {
                        
PreparedStatement pst cn.prepareStatement(sSqL);
                        
pst.setString (1MAC);
                        
int n pst.executeUpdate();
                          }
                           catch (
SQLException ex)
                          {
                             
JOptionPane.showMessageDialog(null,ex);//borrarlo cuando todo marche bien
                          
}
                 } else if ( 
A!= null && !A.equals("") && == MAC  ) {
                     
System.out.print("PC CORRECTA : ");
                     
JOptionPane.showMessageDialog(null," PC CORRECTA");//borrarlo cuando todo marche bien
                 
}

        } catch (
UnknownHostException e) {

        
e.printStackTrace();

    } catch (
SocketException e){

        
e.printStackTrace();

    }

   }

  #8 (permalink)  
Antiguo 01/03/2012, 12:55
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Como se hace para asegurar tu código java

Hola:

¿Y si ahora me llevo el programa a otro PC y empiezo con una ejecución desde cero (base de datos vacía)?. El programa lee la dirección mac y como la base de datos está vacía, encripta la mac y la guarda en bd ...... y se ejecuta bien. He conseguido pirateártelo sin hacer nada especial, salvo ejecutar el programa por primera vez en otro PC

Es mejor que no lo haga el programa en la primera instalación, sino que sea un proceso manual que realices tú o alguien autorizado. Coges la mac, la encriptas manualmente y la insertas manualmente en base de datos. O bien, si no quieres "desplazarte", pides la dirección mac al cliente, generas un fichero de texto con ella encriptada y se lo envías al cliente, para que lo ponga junto a tu jar. El jar tiene que buscar ese fichero a piñón fijo y no ejecutarse si no está o el contenido no coincide con la MAC del pc encriptada.

Por cierto, las cadenas no se comparan con A==MAC, sino con A.equals(MAC). Posiblemente no entre nunca en ese if.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 01/03/2012 a las 13:04
  #9 (permalink)  
Antiguo 01/03/2012, 13:18
Avatar de FiruzzZ  
Fecha de Ingreso: diciembre-2007
Ubicación: en casa
Mensajes: 470
Antigüedad: 16 años, 11 meses
Puntos: 41
Respuesta: Como se hace para asegurar tu código java

Primeramente! la solución planteada no tienen nada que ver con el título "asegurar tu código".
La respuesta a tú título es un obfuscator (ProGuard, yGuard, Dasho).

pero bue, ya que estamos.. algunas cuestiones relacionadas tópico explayado:

1. ¿y si se deshabilita o cambia la placa de red (onboard o PCI) y se cambia por otra (por diversas cuestiones de la vida que ya te podés imaginar)?

2. Hay varias razones por las cuales alguien desearía cambiar de MAC (esto es posible hace mucho tiempo y nada difícil). En sistemas web el uso de MAC es obsoleto.

3. Como punto mas fuerte: tu aplicación va ser exclusivamente MONO-usuario?, NO Cliente-Servidor? no se va poder tener una DB central y varias pcs trabajando sobre esta? Por la forma que se ve del esquema de tu DB, esto va ser imposible
__________________
BadProgrammerException!

Última edición por FiruzzZ; 01/03/2012 a las 13:28
  #10 (permalink)  
Antiguo 01/03/2012, 16:31
 
Fecha de Ingreso: agosto-2011
Ubicación: Madrid
Mensajes: 185
Antigüedad: 13 años, 2 meses
Puntos: 29
Respuesta: Como se hace para asegurar tu código java

Cita:
Iniciado por chuidiang Ver Mensaje
Hola:

¿Y si ahora me llevo el programa a otro PC y empiezo con una ejecución desde cero (base de datos vacía)?. El programa lee la dirección mac y como la base de datos está vacía, encripta la mac y la guarda en bd ...... y se ejecuta bien. He conseguido pirateártelo sin hacer nada especial, salvo ejecutar el programa por primera vez en otro PC

Es mejor que no lo haga el programa en la primera instalación, sino que sea un proceso manual que realices tú o alguien autorizado. Coges la mac, la encriptas manualmente y la insertas manualmente en base de datos. O bien, si no quieres "desplazarte", pides la dirección mac al cliente, generas un fichero de texto con ella encriptada y se lo envías al cliente, para que lo ponga junto a tu jar. El jar tiene que buscar ese fichero a piñón fijo y no ejecutarse si no está o el contenido no coincide con la MAC del pc encriptada.

Por cierto, las cadenas no se comparan con A==MAC, sino con A.equals(MAC). Posiblemente no entre nunca en ese if.

Se bueno.
Si tuviera que hacerlo, por la razón que fuera, usando la MAC, se haría como tu dices claro, manualmente la primera vez almacenándola y lo único que haría sería comprobar. Por supuesto, esta solución no es nada profesional. Lo que yo di fue una primera aproximación, algo de "andar por casa" que llaman, en el caso que tuviera que instalarle mi aplicación al vecino por ejemplo y no quisiera que este se lo pase a otro sin mi permiso. Si lo que hablamos es de un programa profesional para instalar en una empresa ya habría que buscar una solución seria.
  #11 (permalink)  
Antiguo 01/03/2012, 17:11
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Como se hace para asegurar tu código java

Hola:

Depende de cómo se creen las tablas en esa base de datos. Si lo hace automáticamente la aplicación, te la podrás llevar a cualquier lado sin problemas. Si las tablas se crean manualmente, la protección real es saber o no crear/copiar esas tablas.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #12 (permalink)  
Antiguo 02/03/2012, 08:24
Avatar de venezolana32  
Fecha de Ingreso: septiembre-2009
Mensajes: 71
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Como se hace para asegurar tu código java

Gracias de verdad por compartir sus conocimientos , para esto son los foros... para intercambiar ideas.

Este es un sistema monousuario, el cliente no lo quiere cliente servidor.

Chuidiang una pregunta para ver si me quedo claro sera que :

¿Introduzco manualmente la direccion MAC en la tabla config y luego la aplicación la compara este valor con la PC del cliente? o sea elimino la sentencia INSERT de la aplicacion.

Lo del ofuscador lo estuve viendo pero lo deje porque no sabia si tendria que ejecutar el PROGUARD antes de crear el .jar o despues.

Explíqueme algo ¿Para que sirve el Ofuscador ? y ¿ Sera que lo puedo utilizar en esta aplicacion?

Última edición por venezolana32; 02/03/2012 a las 08:40
  #13 (permalink)  
Antiguo 02/03/2012, 10:03
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 1 mes
Puntos: 454
Respuesta: Como se hace para asegurar tu código java

Hola:

Sí, es más seguro si tu insertas manualmente la mac encriptada en la base de datos y el programa solo lo comprueba y no hace el insert.

El ofuscador es otro tema (el título que pusiste al post no tiene que ver con el contenido). Si tu coges un programa java compilado (un .jar, un .class), existend descompiladores capaces de sacar los fuentes .java. El ofuscador sirve para hacer que esos fuentes sean más dificiles de entender.

Por ejemplo, si tu clase se llama Persona y tiene un método setNombre(), si alguien descompila el programa y ve Persona.setNombre() puede intuir para que sirve eso. Sin embargo, si una vez compilado pasas un ofuscador, el ofuscador se encarga de cambiar esos nombres, así Persona se convierte en a y setNombre() en b. Al descompilar el programa y obtener los fuentes, se vería a.b() que dice más bien poco.

Así que en realidad son dos temas distintos:
1) Cómo evitar que ejecuten tu programa en otro PC.
2) Cómo evitar que alguien descompile el programa y obtenga los fuentes.

Obviamente, el ofuscado ayuda al primer punto, ya que si alguien descompila el programa y los fuentes no están ofuscados, podría ver que estás obteniendo la mac, encriptándola en md5 por ejemplo, y comparándola con lo que hay en base de datos. Esto dejaría claro qué hay que hacer para ejecutar el programa en otro PC.

Como ves, puedes hacer pequeñas cosas para evitar pirateo y existen formas de saltárselo, pero cuantas más cosas hagas para evitarlo, más difícil será piratearlo y menos personas serán capaces de hacerlo. Es cuestión de qué esfuerzo estás dispuesto a realizar, qué riesgos reales hay de que pirateen tu programa, que daño te hacen si consiguen piratearlo, etc. Si el programa es para tu vecino que no sabe de informática, posiblemente sobre con la primera propuesta (dirección mac e insert en bd la primera vez). Si vas a hacer un programa con intención de comercializarlo en serio, pues tienes que poner bastantes más medidas de seguridad y aun así siempre habrá alguno capaz de saltársela.

En fin, todo un mundo.

Se bueno.
__________________
Apuntes Java
Wiki de Programación

Última edición por chuidiang; 02/03/2012 a las 10:10
  #14 (permalink)  
Antiguo 02/03/2012, 14:24
Avatar de venezolana32  
Fecha de Ingreso: septiembre-2009
Mensajes: 71
Antigüedad: 15 años, 1 mes
Puntos: 3
Respuesta: Como se hace para asegurar tu código java

Muchas pero muchas gracias a todos los que han participado en este tema me han sacado de una gran confusión , aunque el titulo de este debate decía poco o nada de lo complejo que este tema , gracias por compartir sus conocimientos.

Pues si Chuidiang es una aplicación de escritorio que la voy a comercializar, en un principio para una empresa y luego a otras.

Cuando me toque lo del Ofuscador ya planteare otro tema, desde ya les digo que voy el PROGUARD.

Etiquetas: jar, netbeans, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 07:38.