web-dev-qa-db-ja.com

JavaScriptを難読化(保護)するにはどうすればよいですか。

私はオープンソースではないJavaScriptアプリケーションを作りたいのです、そしてそれで私は私のJSコードを難読化することができる方法を学びたいですか?これは可能ですか?

686
Teifion

難読化:

YUI Compressor を試してください。これは非常に人気のあるツールで、YahooのUIチームによって構築、拡張、および管理されています。

また使用することができます:

プライベート文字列データ:

文字列値を非公開にすることは別の問題であり、難読化は実際にはそれほど有益ではありません。もちろん、あなたのソースを文字化けした、縮小された混乱にまとめることによって、あなたはsecurityからobscurityまでの軽いバージョンを持つことになります。ほとんどの場合、ソースを表示しているのはあなたのユーザーであり、クライアント上の文字列値はそれらの使用を目的としているので、プライベート文字列値のようなものはしばしば必要ありません。

あなたが本当にユーザーに見てほしくない価値を本当に持っていたなら、あなたはいくつかの選択肢があるでしょう。まず、ページの読み込み時に復号化される、ある種の暗号化を行うことができます。これはおそらく最も安全な方法の1つですが、不要な作業もたくさんあります。あなたはおそらくいくつかの文字列値をbase64でエンコードすることができ、それはより簡単でしょう..しかし、それらの文字列値を本当に欲しい人は簡単にそれらをデコードするできます。暗号化は、誰かがあなたのデータにアクセスするのを真に防ぐ唯一の方法であり、ほとんどの人はそれが彼らが必要とするよりも高いセキュリティであると考えています。

サイドノート:

Javascriptの難読化はいくつかのバグを引き起こすことが知られています。難読化ツールはもう少し良くなっていますが、多くの衣装は最小化gzippingから十分な利益を得ていると判断し、さらに難読化の節約{常に価値があるとは限りません)トラブル。あなたのソースを保護しようとしているのなら、あなたのコードを読みにくくするためだけに、それはあなたにとって価値があると決めるかもしれません。 JSMin が良い選択肢です。

396
keparo

グーグルの Closure Compiler について言及したことがない人は驚きだ。それは単に縮小/圧縮するのではなく、未使用のコードを見つけて削除するために分析し、最大の縮小のために書き換えます。型チェックもでき、構文エラーについて警告します。

JQueryは最近YUI CompresserからClosure Compilerに切り替え、 " 堅実な改善 "を見ました

131
Jason Hall

難読化は実際にはうまくいきません。本当にあなたのコードを手に入れたい人にとっては、それは単なるスピードバンプです。さらに悪いことに、それはあなたのユーザがバグを修正すること(そして修正をあなたに返送すること)を防ぎ、あなたが現場の問題を診断することをより困難にします。それはあなたの時間とお金の無駄です。

知的財産法およびあなたの法的選択肢については弁護士に相談してください。 "オープンソース" は "人々がソースを読むことができる"という意味ではありません。代わりに、オープンソースはあなたのコードを自由に使用し変更する許可を与える特定のライセンスモデルです。あなたがそのようなライセンスを与えないならば、あなたのコードをコピーしている人々は違反しています、そして(世界の大部分で)あなたはそれらを止めるための法的な選択肢があります。

あなたが本当にあなたのコードを保護することができる唯一の方法はそれを出荷しないことです。重要なコードをサーバー側に移動し、公開JavaScriptコードにAjax呼び出しを行わせます。

難読化についての私の完全な答えをここに見なさい。

114
Schwern

あなたが望むすべてのJavaScriptソースを難読化することができますが、それは常にすべてのソースコードを実際にクライアントマシン上で実行することを要求することによってリバースエンジニアリング可能です。サーバー側のコードでは、そしてjavascriptが行うすべてのクライアントコードは、サーバー自体に処理のためのリクエストを送信することです。それ以外の場合は、コードが実行しているすべての操作をいつでも追跡できます。

誰かが文字列を安全に保つためにbase64に言及しました。これはひどい考えです。 Base64はすぐにあなたのコードをリバースエンジニアリングしたい人々のタイプによって認識可能です。彼らが最初にやることはそれをエンコード解除し、それが何であるかを見ることです。

49
Claudiu

無料で利用できるJavaScript難読化ツールは多数あります。ただし、JavaScriptをリバースエンジニアリングできない程度に難読化するのは難しいことに注意することが重要です。

そのために、私はある程度残業していたいくつかのオプションがあります。

  • ゆいコンプレッサー 。 Yahoo!のJavaScriptコンプレッサーは、ロード時間を改善するコードを圧縮するのに役立ちます。比較的うまく機能する小さなレベルの難読化があります。基本的に、Compressorは関数名を変更し、空白を削除し、そしてローカル変数を変更します。これが私が最もよく使うものです。これはオープンソースのJavaベースのツールです。

  • JSMin はDouglas Crockfordによって書かれたツールで、あなたのJavaScriptソースを縮小することを目指しています。 Crockford自身の言葉では、「JSMinは難読化しませんが、醜くなります」。主な目的は、ブラウザへの読み込みを速くするためにソースのサイズを小さくすることです。

  • 無料のJavaScript難読化ツール 。これは実際にコード化することによってあなたのコードを難読化することを試みるWebベースのツールです。私は、その形式のエンコード(または難読化)のトレードオフは、ファイルサイズを犠牲にして生じる可能性があると思います。しかし、それは個人的な好みの問題です。

44
Tom

私がしたいこと:

A. /ハッカーを倒す!

これは私の偽/難読化された秘密のJavaScriptコードLAUNCHERの2番目の部分になります。あなたがソースコードで見るもの。

このコードは何ですか?

  1. 実際のコードをロードします
  2. カスタムヘッダーを設定します
  3. カスタム変数を投稿します

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

B. /コードを少し分かりにくくする

それは何ですか?

  1. それはbase64で上記と同じコードです
  2. これはSECRET JavaScriptコードではありません

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

_ c _ 実際のコードでphpファイルを表示しにくいものを作成する

このPHPコードは何ですか?

  1. 正しい参照元(あなたのランチャーのdomain/dir/code)をチェックします
  2. カスタムHEADERをチェックします
  3. カスタムPOST変数をチェックします

すべて問題なければ、正しいコードを表示するか、偽のコードを表示するか、IPを禁止します。ページを閉じます。

<?php
$t1=Apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

base64 referrer = http://here.is/my/launcher.html

SECRET javascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';

FAKE = window.open('', '_self', '');window.close();

さて、あなたがSECRET JavaScriptでイベントハンドラを定義するならば、おそらくそれはアクセス可能です..あなたはlaunchcodeとネストされたSECRET関数を指すことでそれらを外部で定義する必要があります。

SO ...コードを入手する簡単な方法はありますか? document.body.appendChild(document.createElement('div')).innerText='Awesome';

これがうまくいくかどうかはわかりませんが、私はクロムとチェック済みの要素、リソース、ネットワーク、ソース、タイムライン、プロファイル、監査を使用していますが、上記の行が見つかりませんでした。

note1:もしIns要素 - > networkからTroll.phpのURLをchromeで開くと、偽のコードが生成されます。

注2:コード全体は最新のブラウザ用に書かれています。 polyfillにはもっとたくさんのコードが必要です。

編集

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

Troll.php

<?php $t1=Apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
22
cocco

JScrambler を試してください。私は最近それをスピンさせ、それに感銘を受けました。詳細をあまり気にしないですぐに完成させたい人のために、事前定義された設定で難読化のための一連のテンプレートを提供します。あなたが望むどんな変換/テクニックでも選ぶことによってあなたはカスタム難読化を作成することもできます。

18
Anthony

私がYUI Compressorに対して提案している他の答えの大部分に反して。 Google Closure を使用してください。

圧縮率がそれほど高くないという理由ではありませんが、ほとんどの場合、IEが混乱するようなa = [1,2,3,];などのJavaScriptエラーを検出するためです。

17
Thomas Bonini

インタプリタ言語の問題は、それらを機能させるためにソースを送ることです(あなたがバイトコードのコンパイラを持っているのでなければ、やはり逆コンパイルするのはとても簡単です)。

ですから、パフォーマンスを犠牲にしたくないのであれば、変数名と関数名にのみ作用することができます。それらをa、b ... aa、ab ...またはa101、a102などに置き換えます。そしてもちろん、できる限り多くのスペースや改行を削除します(いわゆるJSコンプレッサーが行います)。
文字列を暗号化してリアルタイムで復号化する必要がある場合は、文字列を難読化するとパフォーマンスが低下します。加えて、JSデバッガは最終的な値を表示することができます...

17
PhiLho

非オープンソースのJavascriptベースのアプリケーションはかなりばかげています。 Javascriptはクライアントサイドのインタプリタ言語です。難読化はあまり保護されていません。

JSの難読化は通常、スクリプトを「保護する」のではなく、スクリプトのサイズを小さくするために行われます。自分のコードを公開したくない状況にある場合は、Javascriptは適切な言語ではありません。

たくさんのツールがありますが、ほとんどの場合、 "コンプレッサ"(または "ミニファイヤー")という単語がその名前に含まれています。

13
dbr

JavaScript Utility Patrick J. O'Neilによる。それは難読化/圧縮して圧縮することができ、それはこれらでかなり良いようです。とは言っても、私は決してそれをいかなる種類のビルドスクリプトにも統合しようとしませんでした。

難読化と縮小の関係 - 私は前者の大ファンではありません。それはデバッグを不可能にします(1行目のエラー... "待って、1行しかありません")そしてそれらは常に展開するのに時間がかかります。しかし、あなたがする必要があるならば...まあ。

11

クライアントサイドのコードを保護することはできません。GoogleChromeでF12キーを押すだけで、javascriptの実行を一時停止になり、すべての文字列が暗号化されています。 美しく itおよび 変数名を変更 そして、ほぼ元のコードになります。

あなたがサーバサイドJavaScript(つまりNodeJS)を書いているのがあなたのサーバをハッキングするのを恐れていてハッカーをより困難にしたいのなら、あなたのアクセスを取り戻すためにより多くの時間を与えます、それでjavacript compilers

複数のファイル/モジュールで使用されている場合でも、すべての変数の名前を変更する唯一のツールなので、Advanced CompilationでClosure Compilerを使用する必要があります。しかし、それはただ問題を抱えています:それが コーディングスタイルで書かれている場合にのみ機能します

11

Dean EdwardのPackerは優れた難読化ツールですが、コード内に含まれる可能性のある文字列要素ではなく、主にコードを難読化します。

参照してください: オンラインJavascript圧縮ツール そしてドロップダウンからPacker(Dean Edwards)を選択してください

5
smdrager

最初にYUI Compressorのようなもので縮小してから、 http://www.javascriptobfuscator.com/ のようなものを使用してすべての文字列と数字をHEX値に変換することをお勧めします。

これで、コードはほとんど理解不可能になるでしょう、そして私はこの段階で、彼が最初から書き直すより実際にあなたのコードを再現するのにより多くの時間がかかると思います。書き換えと複製は、実際にはやめられないものです。やはり私たちは自由人です!

5

Javaスクリプトの難読化にClosure-Compilerユーティリティを使用しています。コードを縮小し、難読化のためのより多くのオプションがあります。このユーティリティは、次のURLのGoogleコードで入手できます。
クロージャツール

しかし今、私はUglifyJSの多くを聞いています。あなたはUglifyが勝者であるように思われるClosure CompilerとUglifyJSの間の様々な比較を見つけることができます。
UglifyJS:Node.js用の高速で新しいJavaScriptコンプレッサー、クロージャと同等のもの

すぐに私はUglifyJSにチャンスを与えるでしょう。

4
shaILU

私は何年も Jasob を使ってきました、そしてそれはそこに最良の難読化ツールを渡しています。
高度なUIを持っていますが、それでも直感的で使いやすいです。
これはHTMLとCSSファイルも扱います。

これを使用する最良の方法は、すべての private 変数にアンダースコアのようなものを追加し、sort機能を使用してそれらをまとめてグループ化し、 check を難読化のターゲットとして使用することです。 。

ユーザーはあなたのソースを見ることができますが、あなたのプライベート変数が_sUserPreferredNickNameのようなものからaに変換されるときに解読することははるかに困難です。

エンジンは自動的にターゲット変数の数を集計し、最大の圧縮を得るためにそれらに優先順位を付けます。

私はJasobのために働いていません、そして私は彼らを宣伝することから何も得ません。
欠点は、無料ではないことと、少し高価なことですが、代替手段と比較してもまだ価値があるということです。

4
Matt

Bananascript を試しましたか?非常に圧縮された完全に読めないコードが生成されます。

4
niutech

このツールを試してください Javascript Obfuscator

私はHTML5ゲームでそれを950KBから150に縮小しただけでなく、ソースコードを判読できないクロージャコンパイラとミニファイナが可逆になるようにしました。

3
Jerczu

これは縮小します しかし難読化しません。コマンドラインJavaを使用したくない場合は、JavaScriptをWebフォームに貼り付けることができます。

3
Chris S

あなたは間違いなく Obfuscriptor を見ることを検討するべきです。

YUI Compressor または Google Closure などの他のツールから見た典型的なJavascriptの縮小化のテクニックを超えています。

難読化されたコードは暗号化されているように見えます。これまでに見たことのあるものとは異なります。

3
Mike

難読化の追加手段として、一部の企業(例:JackBe)はJSファイルではなく* .gifファイル内に暗号化されたJavaScriptコードを入れるという印象を受けています。

3
xgMz

JavaScript/HTML/CSS難読化プログラム/圧縮プログラムとして、 Patu Digua を試すこともできます。

3
Adrian

私は過去にこれを使用しました、そしてそれは良い仕事をします。それは無料ではありませんが、あなたは間違いなく見てみるべきです。
JavaScript難読化ツールとエンコーダ

2
Henry

JavaScriptライブラリーを使用している場合は、Closure CompilerのAdvancedモード・コンパイルと互換性のある(多少の変更を加えた後の)Dojo Toolkitを検討してください。

Dojo - クロージャコンパイラと互換性のある唯一のJavaScriptライブラリ

Closure Advancedモードでコンパイルされたコードは、 全体 コードベース(ライブラリを含む)が難読化されているため、美化者を通過してもリバースエンジニアリングすることはほとんど不可能です。平均25%も小さいです。

単純化されたJavaScriptコード(YUI Compressor、Uglifyなど)は、美しく仕上げた後はリバースエンジニアリングが簡単です。

2
Stephen Chung