Ofuscar el código para proteger… ¿qué?

mess

Hoy en día es fácil acceder a un montón de código fuente de distintos proyectos, aprender de él e incluso adaptarlo y utilizarlo en tus propios desarrollos si la licencia lo permite. Pero no siempre ha sido así. Hubo una época no tan lejana en que lo del código abierto era algo exótico y conseguir código fuente de una aplicación para ver “cómo hacían otros las cosas” parecía un tesoro.

Quizá sean reminiscencias de esa época, o quizá sea porque el código nos sigue pareciendo lo más importante, pero de vez en cuando vuelvo a ver conversaciones sobre ofuscar el código, y de vez en cuando algún compañero con perfil no técnico me comenta horrorizado que “Fulanito le ha enseñado una aplicación con la que puede ver el código de los productos que vendemos”.

Pensando sobre todo en el segundo caso, quiero aprovechar este post para analizar los motivos que nos pueden llevar a utilizar un ofuscador de código y ver si realmente merece la pena usarlo o no.

Proteger la propiedad intelectual

Es el caso que más suelo escuchar. Gente que no quiere que la competencia pueda aprovecharse del conocimiento que hay implícito o explícito en el código de la aplicación para mejorar sus propios productos, o que piensa que cualquiera que tenga acceso al código fuente de la aplicación puede replicar su negocio y hacerles la competencia.

No soy ningún experto en negocios, pero no conozco casi ninguno en que lo importante sea el código fuente. De hecho, en la mayoría de los que conozco, la importancia del producto es muy relativa y para que el negocio sea exitoso hace falta una estrategia de comercialización que suele ser tan complicada de montar como el producto o más. Aunque mañana me regalase Microsoft el código fuente de Windows, dudo mucho que consiguiera ganar dinero comercializando Windows (otra cosa es que le vendiera el código a alguien que sí tuviera capacidad para hacerlo).

Aun asumiendo que el código fuente fuese tan importante a la hora de montar un negocio alrededor de un producto software, ¿cuántas aplicaciones tienen realmente código fuente que sea tan novedoso o crítico como para ser copiado? En las típicas aplicaciones de línea de negocio que la aplicación funcione bien o mal tiene más que ver con la capacidad de desarrollo que con el código como tal. Si no eres capaz de generar código claro, flexible, con buen rendimiento y demás, copiar el código de otro no te va a ayudar mucho. Y eso asumiendo que el código que vas a copiar sea de buena calidad y consigas entenderlo, que no suele ser lo habitual.

En cualquier caso, si el código fuente de la aplicación es realmente tu ventaja competitiva porque tienes un algoritmo mágico que hace algo de muchísimo valor, seguramente lo más razonable sea asegurarte de que el código compilado de tu aplicación sólo está desplegado en máquinas que tú controlas. Ya puestos, tal vez tendría sentido utilizar lenguajes (o incluso elementos hardware) que dificultaran la descompilación, no sólo ofuscar el código de un lenguaje como C# o Java fácilmente descompilable.

Aumentar la seguridad

Otro argumento frecuente. Al ofuscar el código dificultamos el acceso a algoritmos relacionados con la seguridad, como pudiera ser el cifrado de datos, las credenciales de acceso a servicios, etc. Siendo generosos podemos considerar que aplicar ofuscación con este motivo es un caso de defensa por niveles en el que nuestro primer nivel de defensa es negar el acceso al código.

Me temo que ofuscar el código no es suficiente y lo que puede proporcionar es una falsa sensación de seguridad. Estamos cayendo en un caso de seguridad por oscuridad, y eso no suele acabar bien. Si realmente quieres mejorar la seguridad de una aplicación hay muchas formas mejores que ofuscar el código.

Para mejorar la seguridad de una aplicación hace falta utilizar algoritmos fiables para cifrado y firma (que no suelen ser los que tú te inventes, sino algoritmos públicos creados y contrastados). Hace falta gestionar adecuadamente las credenciales y claves de cifrado (lo ideal es no tener que gestionarlas y dejar que lo haga otro por ti) y evitar almacenarlas en sitios poco seguros (no, el código ofuscado no es un sitio seguro).

Evitar cracks

Este probablemente sea uno de los motivos más razonables para ofuscar el código de la aplicación. Si tu aplicación usa algún modelo de licencias que implica pagar por desbloquear funcionalidades, parece lógico que quieras evitar que alguien pueda manipular el código de la aplicación para saltarse las restricciones.

Por desgracia, si hay suficiente interés en crackear una aplicación se acabará crackeando (no hay más que ver casos como los de Windows, Photoshop o la mayoría de juegos) y la mejor forma de evitarlo suele pasar por un cambio de modelo de licencias a un modelo basado en suscripción y que obligue a estar conectado permanentemente. Otra cosa es que te lo puedas permitir en función del perfil de tus usuarios.

Podemos ver la ofuscación como parte de una defensa por niveles (igual que en el caso de la seguridad), aunque también debemos valorar si realmente nos tiene que preocupar que alguien use un crack de la aplicación. Cuando hablamos de productos digitales, que alguien use la aplicación sin pagar su licencia no implica que tenga un coste adicional para el fabricante (el coste del desarrollo será el mismo tanto si lo piratean como si no), y no todos los que crackean una aplicación son clientes potenciales (puede que jamás fuesen a pagarnos una licencia). Partiendo de eso, a veces puede ser preferible no darle demasiada importancia.

En realidad no se trata sólo de evitar que alguien modifique el código de tu aplicación para saltarse tu sistema de licencias, sino de evitar que alguien modifique el código de tu aplicación en general. Por ejemplo, si estás programando un juego online, tal vez quieras evitar que alguien haga trampas y modifique el codigo para tener vidas infinitas o armas que hagan más daño.

Consideraciones técnicas

Además de todo esto, hay que tener en cuenta que ofuscar el código también tiene implicaciones técnicas. Como cambia el nombre de clases y métodos, hay que ser muy cuidadoso para no romper código que utilice reflection y perderemos información en los StackTrace que pueden ser críticos a la hora de resolver un problema.

También hay casos en que ofuscar el código puede dar lugar a ventajas puramente técnicas, por ejempo porque se reduce su tamaño (como al minificar código en Javascript), pero generalmente en esos escenarios la motivación suele ser la inversa: el objetivo es reducir el tamaño y como consecuencia el código acaba ofuscado.

Conclusión

La gente le tiene demasiado cariño al código fuente y le da demasiada importancia. Ofuscarlo para asegurarse de que nadie lo ve tiene aparentes ventajas a la hora de proteger la propiedad intelectual, incrementar la seguridad o evitar modificaciones no autorizadas de la aplicación, pero lo cierto es que una vez analizadas, tal vez estas ventajas no sean tan interesantes.

Si ofuscar el código fuese gratis no tendría duda en aprovechar esas ventajas, por mínimas que fueran. Sin embargo, ofuscar el código implica complicar el proceso de compilación (aunque no sea mucho) y, sobre todo, dificultar la resolución de errores en producción, por lo que es algo que valoraría con cuidado antes de llevar a la práctica.

Imagen de Milestoned.


2 comentarios en “Ofuscar el código para proteger… ¿qué?

  1. Gino Mora dijo:

    Hola, Juanma.
    Llevo un tiempo leyendo tu blog y la verdad es que me fascina, no sé mucho de programación pero la verdad es que me gusta el tema en general. He tenido la duda de si dedicarme a la programación o tomarlo como un hobby, lo llevo pensando bastante tiempo, y la verdad es que estoy algo inseguro de esta desición debido a que yo estudié por 2 años la carrera de traducción e interpretación y realmente no era lo que me gustaba. La verdad es que yo soy, mas que nada, un ferviente amante de la tecnologia y, como la programación es un campo que abarca gran parte de ésta, por eso mismo me atrae bastante este tema. ¿Tú crees que sea buena idea dedicarme a esto?
    Tu respuesta significaría mucho para mi; y, si es afirmativa, agradeceria algunos consejos para empezar.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>