JavaScript難読化ツール
難読化は、JavaScriptソースを読み解くコストを高めます。完全に防げるわけではありませんが(フロントエンドの難読化に万全なものはありません)、軽い覗き見を思いとどまらせ、自動スクレイピングを遅らせるには十分です。このツールは、文字列配列エンコーディング、識別子のマングリング、制御フローの平坦化、そして任意のデッドコード挿入を適用し、どこまで強力にかけるかに応じて各オプションを選択できます。
JavaScriptを難読化する方法
-
1
ソースを貼り付ける
有効なJavaScriptなら何でも構いません。ホストページ側の特定のグローバルプロパティ名に依存している場合は、それらを予約語として設定してください。
-
2
手法を選ぶ
文字列エンコーディング(hex/base64)、識別子のマングリング、制御フローの平坦化、デッドコード挿入、自己防衛ラッパー。
-
3
ターゲットプロファイルを選ぶ
ブラウザ(ES5安全、Node APIなし)、Node.js(`require`や`Buffer`を許可)、または低(主にミニファイのみ)。
-
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倍になることもあります。リリース前に出力サイズのカウンターを確認してください。
関連ツール
ASCII表リファレンス
0から127までの完全なASCII表です。NUL、LF、DELなどの制御コードを含め、各文字の10進数、16進数、8進数、2進数、HTML数値文字参照を表示します。
HTML文字参照
HTMLエンティティの検索可能なリスト、その名称コードおよび数値コード、および特殊文字や記号のワンクリックコピー機能を提供します。
キーボードショートカット一覧
macOS、Windows、Linux向けに、VS Code、Chrome、GNU Readlineを使うBashの公式資料に基づく既定ショートカットを検索できます。
EditorConfig ジェネレーター
インデントのスタイルとサイズ、改行コード、文字コード、空白ルールを指定して .editorconfig ファイルを生成し、IDE やエディタをまたいで書式を統一できます。
メールアドレス検証ツール
メールアドレスを検証します。RFC 5322構文チェック、MXレコードのライブ確認に加え、ローカル部、ドメイン、長さの詳細を表示します。メールは送信されません。
Markdownチートシート
見出し、リスト、表、コード、リンク、画像、GFM構文を、実際のプレビューとコピーできる例で確認できる実用的なMarkdownリファレンスです。
このツールは他の言語でも利用できます
- JavaScript-obfuskerare [SV]
- Obfuscateur JavaScript [FR]
- JavaScript-obfuscator [NL]
- เครื่องมือปิดบังโค้ด JavaScript [TH]
- Trình làm rối mã JavaScript [VI]
- مُبهِّم JavaScript [AR]
- Obfuscator JavaScript [ID]
- Ofuscador de JavaScript [ES]
- JavaScript 난독화 도구 [KO]
- JavaScript-Obfuscator [DE]
- Obfuskator JavaScript [PL]
- Ofuscador de JavaScript [PT]
- Обфускатор JavaScript [RU]
- JavaScript Kod Gizleme Aracı [TR]
- JavaScript混淆器 [ZH]
- JavaScript Obfuscator [EN]
- Offuscatore JavaScript [IT]