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倍になることもあります。リリース前に出力サイズのカウンターを確認してください。
関連ツール
Webpack設定ジェネレーター
短いフォームからwebpack 5のwebpack.config.jsを生成します。entry・出力フォルダー・モードを設定し、TypeScript、Babel、CSSローダー、HtmlWebpackPlugin、開発サーバーを切り替えるだけです。
CMYK から RGB への変換
標準的な計算式で CMYK の割合をおおよその RGB 値と Hex 値に変換し、画面用にすばやく確認できます。
.gitignore ジェネレーター
Laravel、Node.js、Python、Rails のプロジェクト用除外ルールを組み合わせます。結果をコピーするか、.gitignore 入りの ZIP をダウンロードできます。個人用ルールは別に表示します。
16進数から10進数への変換ツール
16進数を10進数(10進法)に変換します。メモリアドレス、エラーコード、RGBチャンネル、任意精度の整数に対応します。
Dockerfileジェネレーター
5つのアプリ構成に合うDockerfileと.dockerignoreを作成。実際の起動対象、作業ディレクトリ、内部ポートを入力し、両方のファイルを確認できます。
Markdownリンク生成ツール
URLとアンカーテキストからMarkdownリンクの記法を生成します。タイトルのツールチップや、長い文書を読みやすく整える参照形式のリンクにも対応しています。
このツールは他の言語でも利用できます
- Obfuscateur JavaScript [FR]
- Ofuscador de JavaScript [ES]
- JavaScript-obfuscator [NL]
- JavaScript 난독화 도구 [KO]
- Obfuskator JavaScript [PL]
- Trình làm rối mã JavaScript [VI]
- Ofuscador de JavaScript [PT]
- เครื่องมือปิดบังโค้ด JavaScript [TH]
- JavaScript-obfuskerare [SV]
- Obfuscator JavaScript [ID]
- مُبهِّم JavaScript [AR]
- JavaScript-Obfuscator [DE]
- JavaScript Obfuscator [EN]
- Offuscatore JavaScript [IT]
- Обфускатор JavaScript [RU]
- JavaScript Kod Gizleme Aracı [TR]
- JavaScript混淆器 [ZH]