JavaScript コードを難読化する方法

JavaScript を貼り付けると、ローカル名の変更、文字列の \xNN・\uNNNN エスケープ化、ドット記法からブラケット記法への変換、コメントの削除を行った同じプログラムが返ります。コードは同じ結果で動作し続け、処理はすべてこのタブ内で完結して何も送信されません。

これは偶発的な読み取りを難しくする難読化であり、暗号化ではありません。ロジックはそのまま残るため、API キーや業務ルールを隠す用途には使えず、読める状態の原本も保管してください。出力を手作業でデバッグするのは骨が折れます。

  1. テキストエリアにスクリプトを貼り付けるか入力します。編集のたびに「Obfuscate JavaScript」を押すか、Ctrl/⌘+Enter で再実行します。
  2. 「Copy」で結果を取得し、「Clear」で次のスクリプトの前に両方のペインを空にします。
  3. 公開前に、結果が分かっている小さなサンプルで出力を一度実行してください。変換は挙動を保つので、確認は1分で済みます。
  4. 元のファイルはそのまま保持してください。難読化したコピーは配布用で、編集し続けるのは読める方のソースです。

難読化ツールが変えるもの、守れないもの

難読化ツールが変えるもの

コメントは削除されますが改行は残るため、// の削除が次の行を飲み込むことはありません。貼り付けたコード内で宣言された識別子(変数、関数、引数、クラス、catch の束縛)は、スコープチェーンに従って短い生成名に変更されます。外部から来る名前やグローバルはそのままです。

文字列リテラルは1文字ずつ \xNN または \uNNNN エスケープに書き換えられ、"use strict" ディレクティブはそのまま残ります。ドットによるメンバーアクセスはブラケットに変わり、console.log は console["\x6c\x6f\x67"] になります。オプショナルチェーンも同じ規則(a?.b は a?.["b"])です。new と import の後ろはそのままにし、#私有フィールドにも触れません。

そうではないもの

暗号化でも圧縮でもありません。文字列は短くならず長くなり、本気の読者はロジックを追えます。目的はコピーや流し読みをためらわせることで、解析を不可能にすることではありません。

コードを一度走査するだけで、バンドラーではありません。import を解決せず、モダンな構文をトランスパイルせず、読み込み方も変えません。同じスクリプトを2回貼り付けると生成名が変わるため出力は異なります。配布には十分ですが、ビルドの比較には使えません。

テスト済みの挙動

出力が入力と同じ値を返すことをテスト済みです。クラス、アロー関数、ネストした ${} を含むテンプレートリテラル、async/await、スプレッド、オプショナルチェーン、null 合体、正規表現リテラルが通ります。モジュールコードは import / export の名前を保ち、そのままモジュールとして読み込めます。

eval や with を使うスクリプトは名前を変更しません(安全に変更できないため)。ただしエスケープとブラケット変換は適用されます。約 80 KB のファイルは数十ミリ秒で処理でき、難読化済みのスクリプトにもう一度適用することもできます。

最近使ったツール: