JS
JS オブファスケーター
JavaScript を難読化して読みにくくします。
JavaScript の難読化について
難読化は、JavaScript の動作はまったく変えずに、人間が読みにくいコードに書き換えます。変数名を意味のない文字列に変更し、文字列リテラルを分割・エンコードし、コードの通常の流れを余計な迂回路を通すように変更します。圧縮(minify)とは異なり、目的はファイルを小さくすることではなく、わかりにくくすることです。
3 つのレベルは、難読化の強さと出力サイズ・実行時コストをトレードオフします。低は識別子を改名し文字列リテラルを配列に移すだけ、中は制御フローフラット化(単純なロジックを追いづらいステートマシンに再構成すること)とデッドコード注入を追加し、高は RC4 でエンコードされた文字列、文字列リテラルのチャンク分割、そして出力が整形し直されたり整形ツールにかけられたりすると壊れる自己防衛コードを有効にします。レベルが上がるほど目に見えて大きなファイルと遅い実行になるため、高はライセンスチェックのように本当にそのコストに見合うコードのために取っておき、アプリケーション全体には使わない方がよいでしょう。
使われる場面
- クライアント側のロジックをコピーや解析しにくくする
- フロントエンドコードに埋め込まれたライセンスチェックや API キーを保護する
- 内部の関数名や変数名を明らかにせずにバンドルを配布する
- 信頼できない環境で動作するコードを改ざんするコストを高める
よくある質問
難読化されたコードは本当に安全ですか?
いいえ。難読化はコードを読んだり書き換えたりする手間を増やしますが、ブラウザで動くものは最終的に意志のある人によって解読される可能性があります。秘密の API キーのような本当に守るべき機密情報を保護する手段として頼ってはいけません。
難読化と圧縮(minify)の違いは何ですか?
圧縮はファイルサイズを縮小しますが、整形ツールで簡単に元に戻せます。難読化は、整形し直した後でも識別子の名前変更、文字列のエンコード、制御フローの再構成などによって、意図的にロジックをわかりにくくします。
難読化するとコードは遅くなりますか?
わずかに遅くなります。特に高いレベルでは、余分な迂回や文字列のデコードによって実行時のコストが少し増えます。ほとんどのフロントエンドコードでは無視できる程度ですが、パフォーマンスが重要なループでは検証する価値があります。
低・中・高のレベルは具体的に何を変えますか?
低は変数や関数を短い無意味な名前に改名し、文字列リテラルを配列に隠します。中は制御フローフラット化(ロジックの分岐を追いづらいステートマシンに再構成すること)に加え、ノイズを増やすだけの無意味なデッドコードを注入します。高は RC4 でエンコードされた文字列、実行時に再結合されるチャンクへのリテラル分割、そして再整形を検知して反応する自己防衛コードを追加します。レベルが一つ上がるごとに出力サイズと実行速度のコストが増える代わりに、元に戻す労力も増えます。