Qu'est-ce que l'obfuscation de code et à quoi ça sert ?

Qu'est-ce que l'obfuscation de code et à quoi ça sert ?

Rendre des données secrètes, le chiffrement et le déchiffrement, font partie intégrante de l'histoire de l'informatique. Que ce soit pour des raisons de sécurité des données personnelles, des stratégies géopolitiques, industrielles et j'en passe...

Mais lorsque vous distribuez un logiciel, ou une application disponible sur le web, le code, qu'il soit compilé (logiciel) ou non (web), doit être exécutable par la machine cliente et ne doit donc pas être chiffré car il devient alors inutilisable.

L'alternative parfois choisie est donc de modifier suffisamment le code d'origine (de manière automatique ou manuel) afin que la lecture et la compréhension de ce dernier soit rendue beaucoup plus difficile pour un utilisateur malveillant, c'est ce que l'on appelle l'obfuscation (brouillage en français).

Cette technique est-elle réellement efficace, et quelles sont ces différentes utilisations, c'est ce que nous allons voir dans la suite de cet article !

3 types d'obfuscation de code

Optimisation

L'obfuscation n'est pas toujours une volonté directe, mais parfois une conséquence, notamment dans le monde du front-end web. Afin d'optimiser le temps de chargement des sites et applications web, il est recommandé d'utiliser des outils dit de "minification".

Lors de la minification, tous les caractères inutiles sont supprimés, les noms de variables et de fonctions sont raccourcis au maximum, donnant un code beaucoup moins lisible, mais plus optimisé pour le chargement.

Si vous voulez en savoir plus sur la minification, je vous conseille de lire mon article qui y est consacré : https://blog.nicolas.brondin-bernard.com/pourquoi-et-comment-minifier-son-code-avec-parcel/

Pourquoi et comment minifier son code ? - Nicolas Brondin-Bernard
Parce que ce n’est pas la taille qui compte !

Artistique

Le code, est un art. J'espère que cette affirmation a fait son chemin et n'est plus à démontrer, mais il existe des compétition d'obfuscation de code, afin de faire ressortir d'avantage le côté artistique de la programmation.

C'est notamment le cas de l'IOCCC pour "International Obfuscation C Code Contest", une compétition composée de plusieurs thématiques, mais tournant toujours autour de l'obfuscation.

L'objectif est de produire un code C fonctionnel, mais avec des contraintes de tailles, formes, artistiques, etc...

Voici un exemple très parlant, d'un code sous la forme d'un donut (à droite), qui à l'exécution produit une animation ascii d'un donut en rotation (à gauche).

Si l'explication vous intéresse, c'est ici : https://www.a1k0n.net/2011/07/20/donut-math.html

Sécurité

La raison la plus évidente, est la tentative de brouiller un code source (et ou le code compilé) afin d'empêcher d'autres développeurs et développeuses d'en comprendre les secrets, de le réutiliser ou de le modifier.

Ce type d'obfuscation peut par exemple consister en :

  • Changement de noms de variables/fonctions
  • Ajouts de modules/fonctions/variables inutiles
  • Chiffrement/Déchiffrement de modules et chargement à la volée
  • Ajout de milliers de commentaires, de saut de lignes, tabulations, etc...

On peut par exemple citer l'initiative JSFuck, qui donne une belle représentation d'obfuscation :

alert(1);

Devient en JSFuck (et est interprétable par un interpréteur Javascript classique) :

[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[+!+[]]]+[+!+[]])

Si vous voulez comprendre comment celà fonctionne : https://github.com/aemkei/jsfuck

GitHub - aemkei/jsfuck: Write any JavaScript with 6 Characters: []()!+
Write any JavaScript with 6 Characters: []()!+. Contribute to aemkei/jsfuck development by creating an account on GitHub.

Est-ce vraiment utile ?

Pour la minification et le côté artistique, la question ne se pose pas trop, mais côté sécurité, y'a-t'il des bénéfices à "obscurcir" son code ?

Et bien pas vraiment, en tout cas ce n'est pas une sécurité sur laquelle il faut baser sa stratégie. Cela peut ralentir les "attaques" ou décourager les moins persévérants ou talentueux, mais tant que votre code se retrouve sur la machine de quelqu'un, il pourra toujours être utilisé, ou détourné.

J'espère que cet article vous aura été utile, et à bientôt sur le blog !

Les articles les plus populaires du blog

Envie de continuer à lire des articles autour du développement web (entre autres) ? Voici la sélection des articles de mon blog les plus lus par la communauté !

Voir la sélection 🚀

Recevez les articles de la semaine par e-mail pour ne rien manquer !

S'abonner à la newsletter 📧
Mes formations disponibles 🎓  -5% inclus pour les lecteurs du blog

À propos de l'auteur

Hello, je suis Nicolas Brondin-Bernard, ingénieur web indépendant depuis 2015 passionné par le partage d'expériences et de connaissances.

Aujourd'hui je suis aussi formateur/coach pour développeurs web juniors, tu peux me contacter sur nicolas@brondin.com, sur mon site ou devenir membre de ma newsletter pour ne jamais louper le meilleur article de la semaine et recevoir des offres exclusives !


Photo par Markus Spiske sur Unsplash