JavaScript難読化ツール

難読化は、JavaScriptソースを読み解くコストを高めます。完全に防げるわけではありませんが(フロントエンドの難読化に万全なものはありません)、軽い覗き見を思いとどまらせ、自動スクレイピングを遅らせるには十分です。このツールは、文字列配列エンコーディング、識別子のマングリング、制御フローの平坦化、そして任意のデッドコード挿入を適用し、どこまで強力にかけるかに応じて各オプションを選択できます。

JavaScriptを難読化する方法

  1. 1

    ソースを貼り付ける

    有効なJavaScriptなら何でも構いません。ホストページ側の特定のグローバルプロパティ名に依存している場合は、それらを予約語として設定してください。

  2. 2

    手法を選ぶ

    文字列エンコーディング(hex/base64)、識別子のマングリング、制御フローの平坦化、デッドコード挿入、自己防衛ラッパー。

  3. 3

    ターゲットプロファイルを選ぶ

    ブラウザ(ES5安全、Node APIなし)、Node.js(`require`や`Buffer`を許可)、または低(主にミニファイのみ)。

  4. 4

    難読化する

    ツールは変換後のコードをサイズの増減とともに出力します。強力な設定では、出力がソースの3〜5倍の大きさになることがあります。

各手法とその代償

手法 攻撃者の労力を高める度合い 実行時コスト サイズコスト
変数名の変更 ほぼゼロ 小さくなる(ミニファイの副次効果)
文字列配列エンコーディング わずか(文字列ごとに1回の参照) +10〜30%
制御フローの平坦化 計測可能(約2〜5%) +50〜150%
デッドコード挿入 低(見せかけのセキュリティ) +20〜50%
自己防衛ラッパー 一度きりのチェック +5〜10%
デバッグ保護 中(DevToolsを検知) 一度きりのチェック +5%
VM/仮想化(有料) 非常に高 大(5〜20倍) +300〜500%

難読化で守れないもの

  • 秘密情報。 フロントエンドのソースに含まれる定数は、時間をかければ必ず読み取れます。APIキー、認証シークレット、価格ロジックなどを隠すために難読化を頼りにしてはいけません。これらはサーバー側へ移してください。
  • 観測可能な出力を持つアルゴリズム。 ブラウザで実行できるものは、デバッガを持つ攻撃者がすべての入力と出力を観察できます。難読化はそれを遅らせるだけで、止めることはできません。
  • 大規模な自動スクレイピング。 スクレイピング対策は、ソースの難読化ではなく、挙動の検知(フィンガープリンティング、レート制限、CAPTCHA)に依存します。

難読化が役立つとき

  • 改ざん防止:組み込みSDK(ライセンス管理、広告SDK、ゲームクライアント)における改ざん対策。
  • コストの引き上げ:競合実装を手軽にコピー&ペーストする手間を増やす。
  • 自動スクリプト分類を困難にする:広範囲を狙うスクレイパーに対して。

逆効果になるとき

  • すでにバンドラーを使っている。 本番モードのWebpack + Terserは、すでにローカル変数のミニファイとマングリングを行っています。二重に難読化をかけてもほとんど効果がなく、バンドルサイズが膨らむだけです。
  • First Paintやコアウェブバイタルを最適化している。 強力な難読化はバンドルを3倍に膨らませ、FCPやLCPを悪化させます。
  • 本番環境でデバッグする必要がある。 重い難読化は、対応するソースマップがないとSentryのスタックトレースをほぼ役に立たなくします。しかもソースマップを配布すれば難読化の意味がなくなります。

よくある間違い

  • 難読化を暗号化と同じものだと考える。両者は別物であり、難読化はあくまで時間稼ぎです。
  • ソースマップを難読化済みバンドルと一緒に本番へ送る。これでは難読化が完全に無効になります。
  • CDNからすでに読み込んだサードパーティライブラリを難読化する。サイズのペナルティだけを負い、得るものはありません。

よくある質問

いいえ。難読化はロックではなく時間稼ぎです。デバッガを使う本気の解析者なら、ロジックを復元してしまいます。軽い覗き見や大半の自動スクレイパーを思いとどまらせるほどコストを上げますが、セキュリティそのものではありません。

プロパティに動的アクセスしている場合(obj["field_name"]Object.keys(obj))や、ホストページ向けに特定の関数名・クラス名に依存している場合は、それらを予約リストに追加してください。そうしないと、プロパティ名の変更で外部連携が壊れることがあります。

元のソースは必ず保管してください。難読化ツールは一方向の変換であり、難読化された出力から元のソースを正確に復元することはできず、読める程度の近似しか得られません。

軽めの難読化で約10〜30%増加します。制御フローの平坦化に文字列配列を加えると50〜150%増えます。最も重い設定ではサイズが3倍になることもあります。リリース前に出力サイズのカウンターを確認してください。

関連ツール

このツールは他の言語でも利用できます