Vue プロジェクトは、コードの暗号化と難読化を実装するために webpack-obfuscator を設定します。

Vue プロジェクトは、コードの暗号化と難読化を実装するために webpack-obfuscator を設定します。

背景

会社のコードは第三者に提供され、利用されます。ソースコードが完全に漏洩しないようにするには、提供されたコードを暗号化して難読化する必要があります。フロントエンドコードを完全に暗号化して難読化することはできませんが、ビルドコードはwebpack-obfuscatorを使用してランダムなジャンクコードセグメント、文字エンコードエスケープなどを追加することで完全に難読化できるため、ソースコードを復元したり読み取ったりすることはできません。

インストール

webpack-obfuscator https://www.npmjs.com/package/webpack-obfuscator

npm インストール --save-dev webpack-obfuscator

構成

// webpack.config.js
JavaScriptObfuscator は、webpack-obfuscator を必要とします。
モジュール.エクスポート = {
 エントリー: {
 'abc': './test/input/index.js',
 'cde': './test/input/index1.js'
 },
 出力: {
 パス: 'dist',
 ファイル名: '[name].js'
 },
 プラグイン: [
 新しい JavaScriptObfuscator({
 Unicode配列を回転: true
 // 配列には除外する必要があるファイルが含まれています}, ['abc.js'])
 ]
};

vue cliプロジェクト構成:

// vue.config.js
定数パス = require('path');
var JavaScriptObfuscator = require('webpack-obfuscator');
モジュール.エクスポート = {
 パブリックパス: process.env.NODE_ENV === 'production' ? './' : '/',
 プロダクションソースマップ: false、
 Webpack を構成する: {
 プラグイン: [
 新しい JavaScriptObfuscator({
 文字列配列を回転: true、
 }, [])
 ]
 },
 pwa: {},
 ページ: {}
}

パッケージ化中にのみ暗号化と難読化を行い、ローカルで実行するときに難読化を行わない場合は、次のように構成できます。

configureWebpack: (process.env.NODE_ENV === 'production') ? {
 プラグイン: [
 新しい JavaScriptObfuscator({
 // ...
 }, [])
 ]
 } : {},

webpack.prod.conf.jsvue cli 2.x構成

建てる

npm 実行ビルド

ビルドファイルの比較

1. 原文

//テスト
関数abc() {
 (i = 0; i < 10; i++ とします) {
 console.log(`${i}th, hello, hello`)
 }
}
ABC() 関数

2. webpackのデフォルト ツールuglifyjs-webpack-plugin

webpackJsonp([2],{lVK7:function(o,l){!function(){for(var o=0;o<10;o++)console.log("The "+o+"th, hello, hello")}()}},["lVK7"]);

3. webpack-obfuscatorにパラメータがない場合

新しい JavaScriptObfuscator({
}, [])
var _0x1f6e=["个,你好,hello","lVK7","log"];!function(n,o){!function(o){for(;--o;)n.push(n.shift())}(++o)}(_0x1f6e,323);var _0x3655=function(n,o){return _0x1f6e[n-=0]};webpackJsonp([2],{lVK7:function(n,o){!function(){for(var n=0;n<10;n++)console[_0x3655("0x0")]("第"+n+_0x3655("0x1"))}()}},[_0x3655("0x2")]);

4. webpack-obfuscatorは高度に難読化されている

パフォーマンスが低い: ぼかしなしの場合よりもパフォーマンスが50-100%低下します

新しい JavaScriptObfuscator({
 // コードを圧縮 compact: true,
 // 制御フローの平坦化を有効にするかどうか(実行速度を 1.5 倍に減らす)
 コントロールフロー平坦化: true、
 // アプリケーション確率; 大規模なコード ベースでは、制御フロー遷移の数が多くなるとコードのサイズが増加し、コードの速度が低下する可能性があるため、この値を下げることをお勧めします。
 制御フロー平坦化しきい値: 1、
 // ランダムなデッドコードブロック(難読化されたコードのサイズが増加)
 デッドコードインジェクション: true、
 //デッドコードブロックの影響確率 deadCodeInjectionThreshold: 1,
 // このオプションにより、開発者ツールのコンソールタブの使用がほぼ不可能になります。debugProtection: true、
 // チェックすると、コンソール タブで間隔を置いたデバッグ モードが強制され、開発者ツールの他の機能の使用が困難になります。
 デバッグ保護間隔: true、
 // console.log、console.info、console.error、console.warn を空の関数に置き換えて無効にします。これにより、デバッガーの使用がより困難になります。
 コンソール出力を無効にする: true、
 // 識別子の難読化方法 16 進数 (16 進数) マングル化 (短い識別子)
 識別子名ジェネレータ: '16進数',
 ログ: 偽、
 // グローバル変数と関数名の混同を有効にするかどうか renameGlobals: false,
 // 配列を固定位置とランダム位置(コードが難読化されたときに生成される)に移動します。これにより、削除された文字列の順序を元の位置と一致させることが難しくなります。元のソース コードが小さくない場合は、ヘルパー関数が注目を集める可能性があるため、このオプションをお勧めします。
 文字列配列を回転: true、
 // コードが難読化された後は、コードの美化は使用できなくなるため、cpmpat:true を設定する必要があります。
 自己防衛: true、
 // 文字列リテラルを削除し、特別な配列に格納します stringArray: true,
 文字列配列エンコーディング: 'rc4',
 文字列配列しきい値: 1,
 // 文字列を Unicode エスケープ シーケンスに変換するかどうかを有効/無効にできます。 Unicode エスケープ シーケンスにより、コード サイズが大幅に増加し、文字列を元の状態に簡単に復元できるようになります。このオプションは、小さなソース コードの場合にのみ有効にすることをお勧めします。
 変換オブジェクトキー: true、
 ユニコードエスケープシーケンス: false
}, []),

ビルドされたファイルサイズ: 29,999 字節(29.2 KB)

var _0xa0d1=["w7Bzw6oKw6E=","wrwIUcOVw4M=","w4bChi3DtcOQ","wpLDtsK5w4LDpA==","OUlQwp1z","woEqw4XCtsOe","YR3DrkDCiA==","woAjwq/Ci8KQ","dDNzw5bDgA==",
// ...
("0x201","xatR")]=function(x){return x()},x[_0x34e6("0x202","vdcx")](_0x2c01f8)},4e3);

3. webpack-obfuscator中程度の難読化

最高のパフォーマンス: ぼかしなしの場合よりもパフォーマンスが30-35%低下します

新しい JavaScriptObfuscator({
 // コードを圧縮 compact: true,
 // 制御フローの平坦化を有効にするかどうか(実行速度を 1.5 倍に減らす)
 コントロールフロー平坦化: true、
 // アプリケーション確率; 大規模なコード ベースでは、制御フロー遷移の数が多くなるとコードのサイズが増加し、コードの速度が低下する可能性があるため、この値を下げることをお勧めします。
 制御フロー平坦化しきい値: 0.75、
 // ランダムなデッドコードブロック(難読化されたコードのサイズが増加)
 デッドコードインジェクション: true、
 //デッドコードブロックの影響確率 deadCodeInjectionThreshold: 0.4,
 // このオプションにより、開発者ツールのコンソールタブの使用がほぼ不可能になります。debugProtection: false、
 // チェックすると、コンソール タブで間隔を置いたデバッグ モードが強制され、開発者ツールの他の機能の使用が困難になります。
 デバッグ保護間隔: false、
 // console.log、console.info、console.error、console.warn を空の関数に置き換えて無効にします。これにより、デバッガーの使用がより困難になります。
 コンソール出力を無効にする: true、
 // 識別子の難読化方法 16 進数 (16 進数) マングル化 (短い識別子)
 識別子名ジェネレータ: '16進数',
 ログ: 偽、
 // グローバル変数と関数名の混同を有効にするかどうか renameGlobals: false,
 // 配列を固定位置とランダム位置(コードが難読化されたときに生成される)に移動します。これにより、削除された文字列の順序を元の位置と一致させることが難しくなります。元のソース コードが小さくない場合は、ヘルパー関数が注目を集める可能性があるため、このオプションをお勧めします。
 文字列配列を回転: true、
 // コードが難読化された後は、コードの美化は使用できなくなるため、cpmpat:true を設定する必要があります。
 自己防衛: true、
 // 文字列リテラルを削除し、特別な配列に格納します stringArray: true,
 文字列配列エンコーディング: 'base64',
 文字列配列しきい値: 0.75、
 変換オブジェクトキー: true、
 // 文字列を Unicode エスケープ シーケンスに変換するかどうかを有効/無効にできます。 Unicode エスケープ シーケンスにより、コード サイズが大幅に増加し、文字列を元の状態に簡単に復元できるようになります。このオプションは、小さなソース コードの場合にのみ有効にすることをお勧めします。
 ユニコードエスケープシーケンス: false
}, []),

ビルドされたファイルサイズ: 7066字節(6.90kb)

var _0x1a25=["UmFzT1U=","RkVIc0o=","VUt2eW4=","Q29IS0g=","V1NSZ0k=","d3RNT2w=","dlV6cUw=","RlpzZWg=","QnpzSlE=","cXBqQ1k=","YXBwbHk=","bFZLNw==","Y3p1Ymo=","TFZlQXE=","Y2NKWlY=","cmV0dXJuIChmdW5jdGlvbigpIA==",
// ...
(b[_0x4bcb("0x2a")]("第"+c,b[_0x4bcb("0x2b")]))}})}},[_0x4bcb("0x2f")]);

4. webpack-obfuscator低難読化

高いパフォーマンス: 難読化なしの場合よりもパフォーマンスがわずかに低下します

新しい JavaScriptObfuscator({
 // コードを圧縮 compact: true,
 // 制御フローの平坦化を有効にするかどうか(実行速度を 1.5 倍に減らす)
 コントロールフロー平坦化: false、
 // ランダムなデッドコードブロック(難読化されたコードのサイズが増加)
 デッドコードインジェクション: false、
 // このオプションにより、開発者ツールのコンソールタブの使用がほぼ不可能になります。debugProtection: false、
 // チェックすると、コンソール タブで間隔を置いたデバッグ モードが強制され、開発者ツールの他の機能の使用が困難になります。
 デバッグ保護間隔: false、
 // console.log、console.info、console.error、console.warn を空の関数に置き換えて無効にします。これにより、デバッガーの使用がより困難になります。
 コンソール出力を無効にする: true、
 // 識別子の難読化方法 16 進数 (16 進数) マングル化 (短い識別子)
 識別子名ジェネレータ: '16進数',
 ログ: 偽、
 // グローバル変数と関数名の混同を有効にするかどうか renameGlobals: false,
 // 配列を固定位置とランダム位置(コードが難読化されたときに生成される)に移動します。これにより、削除された文字列の順序を元の位置と一致させることが難しくなります。元のソース コードが小さくない場合は、ヘルパー関数が注目を集める可能性があるため、このオプションをお勧めします。
 文字列配列を回転: true、
 // コードが難読化された後は、コードの美化は使用できなくなるため、cpmpat:true を設定する必要があります。
 自己防衛: true、
 // 文字列リテラルを削除し、特別な配列に格納します stringArray: true,
 文字列配列エンコーディング: false、
 文字列配列しきい値: 0.75、
 // 文字列を Unicode エスケープ シーケンスに変換するかどうかを有効/無効にできます。 Unicode エスケープ シーケンスにより、コード サイズが大幅に増加し、文字列を元の状態に簡単に復元できるようになります。このオプションは、小さなソース コードの場合にのみ有効にすることをお勧めします。
 ユニコードエスケープシーケンス: false
}, []),

ビルドされたファイルサイズ: 2,424 字節(2.36 KB)

var _0x37a6=["exception","trace","console","个,你好,hello","lVK7","apply","re​​turn (function() ",'{}.constructor("return this")() ',"log","warn","debug","info","error"];!function(n,e){var o=function(e){for(;--e;)n.push(n.shift())};
// ...
[_0xe1fd("0x3")]("第"+n+_0xe1fd("0xb"))}()}},[_0xe1fd("0xc")]);

比較表

ファイル名ファイルサイズ通常ビルドパラメータなし非常に難読化されている中程度の混乱難読化の低さ
テスト117 バイト177 バイト363 バイト29.2 KB (29,999 バイト) 6.90KB (7066 バイト) 2.36 KB (2,424 バイト)
jQuery.js のサンプル111 KB (113,852 バイト) 85.0 KB (87,064 バイト) 115 KB (117,770 バイト) 1.24 MB (1,304,998 バイト) 401 KB (411,543 バイト) 117 KB (120,243 バイト)

主な属性

{
 // 圧縮、改行なし compact: true,
 // 制御フローの平坦化を有効にするかどうか(実行速度を 1.5 倍に減らす)
 コントロールフロー平坦化: false、
 // アプリケーション確率; 大規模なコード ベースでは、制御フロー遷移の数が多くなるとコードのサイズが増加し、コードの速度が低下する可能性があるため、この値を下げることをお勧めします。
 制御フロー平坦化しきい値: 0.75、
 // ランダムなデッドコードブロック(難読化されたコードのサイズが増加)
 デッドコードインジェクション: false、
 //デッドコードブロックの影響確率 deadCodeInjectionThreshold: 0.4,
 // このオプションにより、開発者ツールのコンソールタブの使用がほぼ不可能になります。debugProtection: false、
 // チェックすると、コンソール タブで間隔を置いたデバッグ モードが強制され、開発者ツールの他の機能の使用が困難になります。
 デバッグ保護間隔: false、
 // console.log、console.info、console.error、console.warn を空の関数に置き換えて無効にします。これにより、デバッガーの使用がより困難になります。
 コンソール出力を無効にする: false、
 // 難読化されたソース コードをロックダウンして、特定のドメインおよび/またはサブドメインでのみ実行されるようにします。これにより、誰かがソース コードをコピーして貼り付け、別の場所で実行することが非常に困難になります。
 ドメインロック: [],
 // 識別子の難読化方法 16 進数 (16 進数) マングル化 (短い識別子)
 識別子名ジェネレータ: '16進数',
 // グローバル識別子に特定のプレフィックスを追加します。同じページに読み込まれた複数のファイルを難読化する場合は、このオプションを使用します。このオプションは、これらのファイルのグローバル識別子間の競合を回避するのに役立ちます。ファイル識別子ごとに異なるプレフィックスを使用します。プレフィックス: '',
 入力ファイル名: ''、
 // コンソールへのログ記録を有効にします。
 ログ: 偽、
 // グローバル変数と関数名の混同を有効にするかどうか renameGlobals: false,
 // 難読化と生成された識別子を無効にする reservedNames: [],
 // 文字列リテラルの変換を無効にする reservedStrings: [],
 // 配列を固定位置とランダム位置(コードが難読化されたときに生成される)に移動します。これにより、削除された文字列の順序を元の位置と一致させることが難しくなります。元のソース コードが小さくない場合は、ヘルパー関数が注目を集める可能性があるため、このオプションをお勧めします。
 文字列配列を回転: true、
 // コードが難読化された後は、コードの美化は使用できなくなるため、cpmpat:true を設定する必要があります。
 シード: 0,
 自己防衛: 偽、
 ソースマップ: false、
 ソースマップベース URL: ''、
 ソースマップファイル名: ''、
 ソースマップモード: '分離'、
 // 文字列リテラルを削除し、特別な配列に格納します stringArray: true,
 // stringArray 内のすべての文字列リテラルを base64 または rc4 を使用してエンコードし、実行時にデコードされる特別なコードに挿入します。 true (ブール値): stringArray は base64 エンコード値を使用します。false (ブール値): stringArray 値をエンコードしません。'base64' (文字列): stringArray は base64 エンコード値を使用します。'rc4' (文字列): stringArray は rc4 エンコード値を使用します。 base64 よりも約 30 ~ 50% 遅くなりますが、初期値を取得するのが難しくなります。非常に大きな難読化コードを防ぐために、rc4 エンコーディングで unicodeEscapeSequence オプションを無効にすることをお勧めします。
 文字列配列エンコーディング: false、
 // 文字列リテラルが stringArray に挿入される確率を調整します stringArrayThreshold: 0.75,
 // 難読化されたコードのターゲット環境を次のいずれかに設定できます: Browser; Browser No Eval; Node
 ターゲット: 'ブラウザ',
 // オブジェクトキーの難読化を有効にするかどうか transformObjectKeys: false,
 // 文字列を Unicode エスケープ シーケンスに変換するかどうかを有効/無効にできます。 Unicode エスケープ シーケンスにより、コード サイズが大幅に増加し、文字列を元の状態に簡単に復元できるようになります。このオプションは、小さなソース コードの場合にのみ有効にすることをお勧めします。
 ユニコードエスケープシーケンス: false
}

知らせ

  • webpack-obfuscatorをインストールするときは、 webpack-obfuscatorのバージョンがローカル プロジェクトのwebpackバージョンと一致するように注意してください。私は[email protected]を使用しており、プロジェクトのwebpackバージョン4.xです。 ( webpack 4.x版エラーを報告し、最新バージョン[email protected]では使用できません。また、 webpackバージョン5.xにアップグレードされていません)。
  • excludes數組multimatch包語法と互換性があります。たとえば、 ['js/chunk-vendors.**.js']['excluded_bundle_name.js', '**_bundle_name.js'] 、または'excluded_bundle_name.js'などをサポートします。

記事アドレス: https://www.cnblogs.com/dragonir/p/14445767.html 著者: dragonir

関連記事参照:

js コードの難読化

webpack 難読化ツール https://blog.csdn.net/qq_31126175/article/details/86526237

これで、コードの暗号化と難読化のために vue プロジェクトで webpack-obfuscator を構成する方法についての記事は終了です。vue webpack-obfuscator コードの難読化に関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • webpack が vue プロジェクトをパッケージ化した後に生成された dist ファイルの実行を開始する方法の詳細な説明
  • vue-cliでchainWebpackを使用する方法を簡単に説明します

<<:  Linux で文字列を整理するためのヒント

>>:  MySQL SQL文の特殊処理文のまとめ(必読)

推薦する

フレックスレイアウトとposition:absolute/fixedの競合の詳細な説明

以前、プロジェクトを開発しているときに、flex レイアウトと position:absolute/...

PHP+nginx サービス 500 502 エラーのトラブルシューティングのアイデアの詳細な説明

概要オンラインサービスへのアクセス中に 500 または 502 エラーが発生した場合、緊急処理とトラ...

js キャンバスは検証コードを実装し、検証コード機能を取得します

この記事の例では、検証コードを作成して取得するためのjsキャンバスの具体的なコードを共有しています。...

Linux でファイアウォールがオフになっているかどうかを確認する方法

1. サービス方法ファイアウォールのステータスを確認します。 [root@centos6 ~]# サ...

Mysql の遅いクエリ操作の概要

MySQL の遅いクエリの説明MySQL スロー クエリ ログは、MySQL が提供するログ レコー...

CSS3 のフィルタプロパティの使用に関する詳細な説明

最近、イントラネットポータルを修正していたときに、フィルターを使用する必要がある箇所に遭遇しました。...

JavaScript 開発における標準コミットメッセージの重要性の詳細な説明

目次標準コミットメッセージの重要性コミットするコミットリント依存関係をインストールする.commit...

javascript 入力画像のアップロードとプレビュー、FileReader プレビュー画像

FileReader は、フロントエンドのファイル処理、特に画像処理にとって重要な API です。画...

Docker での Redis 接続の急増をトラブルシューティングした実践的な記録

土曜日、本番サーバー上の Redis サーバーが利用できなくなり、エラー メッセージは次のようになり...

JavaScript ES6 モジュールの詳細な説明

目次0. モジュールとは何か1.モジュールの読み込み1.1 方法1 1.2 方法2 2. 輸出と輸入...

http:// の代わりに // を使用する利点は何ですか (アダプティブ https)

//デフォルトプロトコル/ デフォルト プロトコルの使用は、リソース アクセス プロトコルが現在の...

MySQLデータベースは何をするのか

MySQL は、スウェーデンの会社 MySQL AB によって開発されたリレーショナル データベース...

メタ宣言注釈の手順

メタ宣言注釈の手順: 1. モバイル ページと 1 対 1 で対応するすべての PC ページを分類し...

Linuxのwatchコマンドの使用

1. コマンドの紹介watch コマンドは、指定されたコマンドを定期的に実行し、実行結果を全画面に表...

動的なデジタル時計を実装するJavaScript

この記事では、JavaScriptで動的なデジタル時計を実装するための具体的なコードを参考までに紹介...