Javascript向けのテキスト難読化サービス、SHINOVIを公開しました。
SHINOVI (opens new window)はJavascript向けのテキスト難読化サービスです。
半分以上は自分のために作りました😀
# 既存の難読化との違い
Javascriptは今日、WEBサイトになくてはならない存在となったこともあり、世の中にはすでに数多くのJavascript向け難読化サービスがあります。VueやReactでサイト構築を行ったり、Webpackでビルドすれば特に何も考えなくてもある程度の難読化はされますし、特に難しいことはありません。
ではなぜ、わざわざオリジナルの難読化サービスを作成したのでしょうか?
それはかねてから下記の2つの点で既存の難読化サービスに不満を持っていたからです。
- どんなに難解な難読化を行っても、ブラウザからスクリプトが実行可能である以上、デコーダーが作られてしまう。
- 多くの難読化サービスでは文字列リテラルの難読化が行われない。
そのため、もともとこれらの欠点を解消するための難読化ツールを独自にCUIのツールとして開発していたのですが、今回、より気軽に使えるようにWEBツールとして公開することにいたしました。
# SHINOVIの使いどころ
もともと、SHINOVIは上記の不満を解消するために開発されたものですので、Webpackなどの従来のビルドツールでの難読化と併用することを想定しています。
SHINOVIが従来の難読化ツールと大きく異なるのは下記の点です。
- コードの難読化ではなく、文字列や(JSONと互換性のある)オブジェクトの難読化である。
- リストアのために必要な変数を別に定義している。
私自身は基本的にコードの難読化はWebpackなどのビルドツールのプラグインに任せ、それらのコードでは補いきれない脆弱性を本ツールで補う考えですが、特に重要なのは2番目の「リストアのために必要な変数を別に定義している」ことです。
どのような難読化ツールであってもそれ自体の復元は残念ながら可能なのですが、それがどこに定義されているのか見当たらないようなプログラムであればソースコードを追うことが難しくなることはプログラマなら賛同していただけるのではないでしょうか。
# 難読化ツールを過信してはいけない
弊社で公開したSHINOVIも含めてなのですが、Javascriptはそれ自体がクライアントサイドで実行されることもあり、スクリプト内に書かれている内容を完全に隠蔽するのは難しいのが実際のところです。認証関係のSECRET KEYや、第三者の個人情報などはいくら難読化したとしてもそもそもスクリプト内には含めないように設計すべきだと考えています。
弊社のサイトやツールでも、既存のビルドツールでの難読化、SHINOVIでの難読化の他にもいくつか対策を行っておりますが、またそれは別の機会に記事にまとめたいと思います。