こんにちは、@majoLibraryです。
最近はChatGPTなどのAIが話題になっていますが、コードの「難読化」は今後も有効なのでしょうか?そこで、Googleが提供するGAPIの難読化コードをAIに元に戻してもらいました。
難読化されたコード
GAPIの実際のコード例はこんな感じです。
(function(){var aa=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,b,c)...(略)...}).call(this);
これでは簡単に読むことはできません。
AIで難読化解除(要点のみ抜粋)
AIに依頼すると、すぐに読みやすく再構成されました。
// グローバル環境を取得
const getGlobalObject = () => { ... };
const globalObj = getGlobalObject();
// Polyfillの設定
polyfill("String.prototype.endsWith", ...);
polyfill("Array.prototype.includes", ...);
// gapi.load関数の再定義
window.gapi.load = function(apiName, options) { ... };
// スクリプトの非同期読み込み
const injectScriptAsync = (src) => { ... };
文字列の暗号化・制御フローの難読化はどうか?
上記で示した難読化は主に名称変更(リネーム)だけでしたが、より高度な難読化手法として以下のようなものがあります。
文字列の暗号化(String Encryption)
文字列を実行時にしか復号できないようにすると、AIによる解析はかなり困難になります。
// 難読化前
const apiEndpoint = "https://api.example.com";
// 暗号化後
const apiEndpoint = decrypt("U2FsdGVkX1..."); // 実行時に復号
制御フローの難読化(Control Flow Obfuscation)
条件分岐やループを意図的に複雑化することで、コードの動きを把握するのが難しくなります。
// 元のコード
function add(a, b) { return a + b; }
// 制御フロー難読化後(例)
function confusing(a,b){
let x=0;
switch(true){
case (!!a && !!b):
x=(a|0)+(b|0); break;
default: x=0;
}
return x;
}
これらが導入されると、AIでも意味を読み取るのは難しくなり、一定の保護効果が期待できます。
今後の対策
今後は、単純な難読化に頼るのではなく、より高度な難読化手法や、実行時暗号化、サーバーサイド処理の強化など、多層的な防御策を組み合わせることが重要です。ただし、過度な複雑化はパフォーマンスやメンテナンス性に悪影響を及ぼすため、適切なバランスを考える必要があります。
まとめ
AIの進化により「難読化」だけに頼るのは不十分です。
文字列の暗号化や制御フローの複雑化など、高度な難読化手法を組み合わせつつ、コード自体の価値を高めることが重要になります。