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文の特殊処理文のまとめ(必読)

推薦する

VMware Workstation 15 Pro インストール ガイド (初心者向け)

01. VMware Workstation Pro 15 のダウンロードダウンロード: VMwa...

JS 矢印関数に適さないシナリオは何ですか?

目次概要オブジェクトにメソッドを定義するオブジェクトリテラルオブジェクトプロトタイプ動的コンテキスト...

Linuxパフォーマンス監視コマンドの簡単な紹介

システムでさまざまな IO ボトルネック、メモリ使用量の増加、CPU 使用率の増加などの問題が発生し...

cobbler ベースの Linux システムを自動的にインストールする

1. コンポーネントをインストールする yum install epel-rpm-macros.no...

JSscriptタグの属性は何ですか

JS スクリプト タグの属性は何ですか? charset : オプション。 src 属性で指定された...

MySQL での select、distinct、limit の使用

目次1. はじめに2. 選択2.1 単一列のクエリ2.2 複数の列のクエリ2.3 すべての列をクエリ...

IIS7 IIS8 リバースプロキシルールの記述、インストール、構成方法

目的: ステーションAをステーションBのセカンダリディレクトリとして扱うのように: http://w...

Ubuntu で FTP サーバーを構築する方法の詳細な説明 (成功保証)

1. 今日の午後、コースの要件により、Ubuntu で FTP サーバーを設定する実験を行う必要が...

Sublime Text - ブラウザのショートカットキーを設定するための推奨方法

コード効果を異なるブラウザで表示することはよくあることなので、異なるショートカットキーを使用して対応...

MySql8.0以降のバージョンでROOTパスワードを正しく変更する方法

展開環境:インストールバージョン Red Hat Cent 7.0 MYSQL バージョン 8.0....

Web デザイン スキル: iframe の適応高さの問題

おそらく、この問題にまだ遭遇していない人もいるでしょうから、まずは適応高さとは何かを説明しましょう。...

JavaScript 履歴オブジェクトの説明

目次1. ルートナビゲーション2. 履歴状態管理API (1)ハッシュチェンジイベント(2)ポップス...

Ubuntu 20.04 中国語入力方法のインストール手順

この記事では、Google 入力方法をインストールします。実は以前はSogou入力方式を使っていたの...

Vue ソースコード学習でレスポンシブ性を実装する方法

目次序文1. レスポンシブシステムの重要な要素1. データの変更を監視する方法2. 依存関係を収集す...

よく使われる HTML タグとその特徴の完全なリスト

まず、HTML タグのいくつかの特性を知っておく必要があります。 1. 「<keyword&g...