Comment obscurcir du code JavaScript

Collez du JavaScript : l’outil renvoie le même programme avec les noms locaux renommés, les chaînes réécrites en échappements \xNN et \uNNNN, les accès par point convertis en crochets et les commentaires supprimés. Le code s’exécute toujours avec le même résultat ; tout est traité dans cet onglet, rien n’est envoyé.

Il s’agit d’obscurcissement contre la lecture occasionnelle, pas de chiffrement. La logique reste présente : ne comptez pas dessus pour masquer des clés d’API ou des règles métier, et gardez l’original lisible — déboguer la sortie à la main est pénible.

  1. Collez ou saisissez le script dans la zone de texte ; la version obscurcie remplace la sortie précédente. Cliquez sur Obfusquer JavaScript ou utilisez Ctrl/⌘+Entrée après chaque modification.
  2. Copier reprend le résultat, Effacer vide les deux panneaux avant le script suivant.
  3. Avant de diffuser la sortie, exécutez-la sur un petit exemple dont vous connaissez le résultat ; la transformation préserve le comportement et la vérification prend une minute.
  4. Conservez le fichier d’origine. La copie obscurcie sert à la diffusion ; c’est la source lisible que vous continuerez à modifier.

Ce que l’outil modifie — et ce qu’il ne protège pas

Ce que l’outil modifie

Les commentaires sont supprimés mais les retours à la ligne restent, donc effacer une note // n’avale jamais la ligne suivante. Les identifiants déclarés dans l’extrait — variables, fonctions, paramètres, classes, liaisons catch — sont renommés en noms courts générés via la chaîne de portées ; les noms venus de l’extérieur, y compris les globales, ne changent pas.

Les chaînes sont réécrites caractère par caractère en échappements \xNN ou \uNNNN, et la directive "use strict" reste telle quelle. L’accès par point devient un accès par crochets : console.log devient console["\x6c\x6f\x67"], et le chaînage optionnel suit la même règle (a?.b devient a?.["b"]). Après new et import la syntaxe est laissée intacte, et les champs #privés ne sont pas touchés.

Ce que ce n’est pas

Ni chiffrement ni minification. Les chaînes obscurcies sont plus longues, pas plus courtes, et un lecteur déterminé peut encore suivre la logique : le but est de décourager la copie et la lecture rapide, pas de rendre la reconstruction impossible.

Une seule passe sur le code, pas un bundler : les imports ne sont pas résolus, la syntaxe moderne n’est pas transpilée, rien ne change dans le chargement du fichier. Coller deux fois le même script donne deux sorties différentes, car les noms générés dépendent du contenu ; pratique pour diffuser, inutile pour comparer des builds.

Comportement testé

La sortie est testée pour renvoyer les mêmes valeurs que l’entrée : classes, fonctions fléchées, gabarits avec expressions ${} imbriquées, async/await, spread, chaînage optionnel, coalescence nulle et littéraux regex passent. Le code de module conserve ses noms import et export et se charge toujours comme module.

Les scripts qui utilisent eval ou with ne sont pas renommés — ne pas renommer est le seul choix sûr dans ce cas — mais l’échappement et la conversion en crochets s’appliquent quand même. Un fichier d’environ 80 Ko est traité en quelques dizaines de millisecondes ; un script déjà obscurci peut l’être de nouveau.

Outils récents :