難読化 【obfuscation】
コンピュータプログラムの多くは人間が理解しやすいプログラミング言語によってソースコードとして記述され、これを言語処理系がコンピュータで直に解釈できるオブジェクトコードに変換してから実行される。
多くのソフトウェアは変換後の機械語などで記述されたプログラムとして実行環境に提供されるため、これを開発時に書かれた元のソースコードに戻すことは原則としてできない(命令の流れやアルゴリズムなどを断片的に割り出すことはできる場合がある)。
しかし、Webブラウザに読み込んだWebページ上で実行されるJavaScriptプログラムなどは、ソースコードを実行環境に持ち込んでから解釈と実行が行われるため、外部に公開したくないシステム上の詳細な仕様などの一部がソースコード上の記述として「筒抜け」になってしまう。
このような場合に、プログラムの動作の実質は変えず、動作に直接影響しない情報を削除したり、コードを人間が理解しにくい形に変換する処理を難読化という。コンピュータにとっては同じ挙動を指示しているため、実行すると元のソースコードとまったく同じように動作する。
簡単な手法としては、改行や空行、インデントなど「読みやすさ」のために挿入された要素を取り去る、変数名や関数名などのラベル(要素の名前)をすべて自動生成した意味ない文字列で置き換える、文字列リテラルを文字コードなど文字そのもの以外の方法で表記するといった方法がある。
また、元のコードと異なる動作を追加する手法もあり、無意味な条件式や計算命令、例外処理などを挿入する、重要箇所を一定の変換ルールでプログラムではない符号列に変換し、実行時に動的に復元してから実行するといった方法がある。これらは実質的な振る舞いは元のコードと同じになるが、元は存在しない処理が追加されるため、実行時間などは厳密には一致しなくなる。
難読化によって要素名などの情報は不可逆に失われ、他のシステムへの流用や動作の一部の改変、リバースエンジニアリングなどを行いにくくする効果がある。しかし、コードが行う処理の内容は変わっておらず、完全に詳細を秘匿することはできない。コンピュータウイルスなどの中には対策ソフトによる検知を免れるために自身の難読化を行うものもある。