js代码混淆 webpack-obfuscator


文章目录

  • webpack-obfuscator

    安装

    npm install --save-dev webpack-obfuscator

    配置

    webpack-obfuscator git 地址
    官方例子

    // webpack.config.js
    'use strict';
    
    const JavaScriptObfuscator = require('webpack-obfuscator');
    
    module.exports = {
        entry: {
            'abc': './test/input/index.js',
            'cde': './test/input/index1.js'
        },
        output: {
            path: 'dist',
            filename: '[name].js' // output: abc.js, cde.js
        },
        plugins: [
            new JavaScriptObfuscator({
                rotateUnicodeArray: true
            }, ['abc.js'])
        ]
    };
    
    

    vuecli 2.x 配置在 webpack.prod.conf.js 中
    注意这里的abc.js 是排除这个文件,也就是说这个文件不混淆,其他文件混淆

    对比

    未使用webpack-obfuscator

    新建的vuecli2.x脚手架,添加一个index,js,并构建npm run build
    文件大小 117字节

    function abc() {
        for (let i = 0; i < 10; i++) {
            console.log(`第${i}个,你好,hello`)
        }
    }
    abc()
    
    

    构建后,文件大小 177字节 (webpack默认工具为uglifyjs-webpack-plugin)

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

    使用webpack-obfuscator

    1. 无参数时

     new JavaScriptObfuscator({
     	}, [])
    
    

    构建后文件,文件大小:363字节

    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")]);
    
    

    2. 高度混淆,低性能(官方文档)

    性能比没有模糊处理慢50-100%

    new JavaScriptObfuscator({
                compact: true,//压缩代码
                controlFlowFlattening: true,//是否启用控制流扁平化(降低1.5倍的运行速度)
                controlFlowFlatteningThreshold: 1,//应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
                deadCodeInjection: true,//随机的死代码块(增加了混淆代码的大小)
                deadCodeInjectionThreshold: 1,//死代码块的影响概率
                debugProtection: true,//此选项几乎不可能使用开发者工具的控制台选项卡
                debugProtectionInterval: true,//如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
                disableConsoleOutput: true,//通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
                identifierNamesGenerator: 'hexadecimal',//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
                log: false,
                renameGlobals: false,//是否启用全局变量和函数名称的混淆
                rotateStringArray: true,//通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
                selfDefending: true,//混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
                stringArray: true,//删除字符串文字并将它们放在一个特殊的数组中
                stringArrayEncoding: 'rc4',
                stringArrayThreshold: 1,
                transformObjectKeys: true,
                unicodeEscapeSequence: false//允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
            }, []),
    
    

    构建后文件,文件大小: 29,999 字节(29.2 KB)

    var _0xa0d1=["w7Bzw6oKw6E=","wrwIUcOVw4M=","w4bChi3DtcOQ","wpLDtsK5w4LDpA==","OUlQwp1z","woEqw4XCtsOe","YR3DrkDCiA==","woAjwq/Ci8KQ","dDNzw5bDgA==","VcK8HCM=","JMO3C8K7Zg==","BsK6w7zCkg==","YsOlw71Qwos=","asO/wrPCkBnDmcKhN8Kkw65l","w6fDuwc5bg==","dzLDh1XCog==","OsOEw4dcw78=","WTLDlmbCpQ==","wqN8wr9lew==","w4jDlWXCsMKo","fhR6NsKj","wro4woTCvMKY","wrETRMO0w5g=","O2Jrwrx9","wrw3emE9","wpd5esOnwrs=","wpQtZU0j","wqrChMOMVMOq","ZSfDnUjCpQ==","w6LDgyZdeg==","B37Dh8O7YA==","woZTwrxFQg==","wqnCtMObZcOv","bsK5woDCtMKM","fMK/OTdP","UxN+w5TDtw==","ScOIwp7CihE=","wrMaZ3cS","fcOlwrvCnnQ=","wrYAw5vCg8OU","w4nChTHDjMOR","AmjDp8ObYw==","PkhNw5PDiw==","wqXCocOIU8O0","wo4Tw6rCuMOn","wqIJSsO6w7Q=","LB0Xw7Z1","OsOvwqk2GQ==","K8Okw5p2NA==","acKOwpLCs8Kn","J8KHZMO2IA==","w4vCgzDDl8Of","w4hbw4MLw4A=","HifCjgJO","HDjCkB1DwrzDiG/CjkEO","w6RAw7Epw60=","bi7DqkHChA==","w5tTw7kKw4E=","wq9PBghW","FMO8wok6BQ==","PDABwpls","EsOCw7NDZQ==","wqPDscKVw6fDnA==","bMKIwrvCtMKo","5LuoWeS/leWlgQtXwoV0RQM=","w79KwqXCr0g=","KR0ew7hQFcOUwqLCq8Ozw7zCvsKbwrXClw8=","CjLCmiFe","P8OVacKxZcKDw6J1UsO8e8OYPjggCnoyS8OdOMKcwrLDjCIcwrjDuSnChzt5QDV7w4w8NMKTwpPDv0jCjmfChcOmw4nDoMK8wrzCqVluZcK3WcO0w4wGwqPDh8OG","XhtQw6DDvQ==","fcO/wqTCgBk=","RTrDvkY=","M2VUwp14","LAARw7JK","woIyaxnCvw==","wpIvUwnCtA==","w5YmKjfClw==","w5/DlUzCn8KX","wr5+JBFq","AMO6w6NPw5k=","wovDisKkw7jDjA==","FcOTw4Ndw7o=","IMKVQj7CiA==","w6kODDDCjA==","dMOgwpnCqj4=","MX5UwqR6","wpE/XBjCkA==","cMKEw5nChX5vw6IQRHnDg8Kiw4/DpHAvfiBl","UcOOwqPCoBM=","Mno0wo1Ww4zDk8OOGcOzJ8OawrZXw5vDlQ7DvcO4Dm15w6AeKMK8wrIzJsKwwrU+","O8Odw45XTg==","MMOFw5FvcQ==","esKtZCo3","Z8K1wpzCicOC","EBY9w58Y","RsKUwqfCuMK1","wozCgcODK2A=","woMFeR7Cog==","SMKTHT9L","w5VVw4B3OhNQw69lwo7CgCtUOMOcwrY1","DcKGQsOTHA==","eA3Dq3vCijcOw6nCoGkTSyV4wpU=","JmNvwopB","w7Jsw68Iw6xXwq0=","wo8Bwq3Cl8KI","wrwEUHw9","BcOiw6RebQ==","RsKee8KKw7U=","J8ORw6B6w6I=","woEyw7p5fw==","woPCl8O6UsOq","wpRsGTxl","MUZ0w6PDrQ==","U8KCBsOmc8OVw742WcOfecOcIw==","w4HCgyzDpcOS","fyzDvl3Cpw==","wozChsOaHE4=","Pykiw65h","wrLDlMKCw7LDnw==","FEJTw5jDkQ==","PMOOw4DCtsO5","MDACwpZK","wqgSw49JdQ==","ZMOgw6Nwwq0=","Ii42wqlb","A8Oew5hSGg==","JlpFw4jDow==","wqAcWMOSw4I=","YsKjScK2w4c=","wqvCrMO8","BcOzA8KvdQ==","w74BPBTCkQ==","WsKXaC8N","AcO6w51gw4c=","I8O/w4HCs8O7","DkXDm8OrZQ==","wpjCi8OEWMO5","ccKhVMKDw5o=","GTHCljZc","w4rDtH3CuMKc","wocuSD8=","TizDpEHCnQ==","NQo+w6hl","w4ZawpLCuVw=","RMK+wqXCn8OR","wq0owp3ChsKw","eMOew699woE=","XcK2GQ==","d8OlwqfCrHk=","B0nDosOQQQ==","AcK3eQ3CsA==","wp4Nw4XCrcOi","wow3w6zCncOjJ00=","woVvTsOKwr4=","QsOsw45ZwqU=","wqBzwrNNTg==","Bi00w4sgeQA=","C2hLwrpN","JcOCw7Vrw78=","G8OUw4p9w6w=","w6PCoQ3DmsOi","e8Krw47CmUU=","QsKpEj92","WMKRQC8=","w6nDnzNaSw==","FMKfR8O0","LsKXWj7CvQ==","JMOkw7Nvw40=","EsOxwo0yJBfChiUQ","FcOkw7Y=","woFGwpZ4fB0Rw7Ahwp3Dgw==","KlZVw5LDuQ==","woPDiMKDw53Dlw==","XsKbUyQ5","wrQkeV4v","HB0pw5VP","SMKxwobCk8O0","w5HDmws7QQ==","TMOOwrjCtXM=","LRwXw4hn","AsK3SQ/CtQ==","w7nDhRdNdA==","wpwow67Ch8O4","wrPCjcONb8OuVzk=","wq1PcQ==","HsOvH8KkXsK6Ww==","w5o6KC3CkQ==","woHDl8Kdw4LDgcKTCA==","wo0hSsOzw51oBMK8w4k=","esOkwrzClxPDusKm","w57Dgzcf","GMOIw7hrNsKqUg==","EsOJw7B3","w6HCvhPDhcO0w4bCqw==","RcKrHzVn","VcK8HCNl","wrwNw7XCusOt","wrDCrUzDisKsw5bDuFPCm8OQAsOmDDvDvcOdBA==","w7vCuSjDgsOK","XsONw6ZHwoo=","wonDk8OaIyQ=","w4/DhgszdA==","w4Bmw7Q3w7I=","wo7DpsOiPhI=","O8KIcgPCiw==","w65lwpXCj3o=","bsKAwqPClsO9","5Liuw6jkvZDlprHCn8O9bcKjw53CqQ==","w7hMIiHDhA==","wpvDkMKmw4XDvw==","LMOhw5hhPA==","w4ZFw5Qfw70=","w4/DsHvCsMKA","Ikpsw5nDlg==","wpbCpsO1C04=","ZsK2W8Kfw5Y=","w5VRwqnCuFU=","w6wdLRbCgg==","w53DsGfCtcKN","w4vDsnnCs8KL","D8KRUg==","w4zDmiYUckpkw7g8","wpZbwplobQ==","LWJ4wpte","c8KlQsKi","bsKOwpPCtA==","a8KPwpI=","wpszw6JYbQ==","w5vClyrDksOR","BDIew5Bv","woYgbzrCpw==","wo5/wrM8","w7tlHRvDsg==","NcOOw7NSKw==","WcONwrRHFwjCi0pvdCDCs8Oz","ScKnZsK/w7A=","d8OlwoHCml8=","DMOGw6vCscOS","CsOwKcKgRQ==","PCUIw6o6","H8OUw4dKSw==","UcKGw6rCuWQ=","OcKZawDCiw==","w6XClirDscO9","FMOvOsKSYw==","Hh4mw5V2","Six8w57Dhg==","dcKFwoHCrsKWwrYLworCoMO8wrLDkyrDgGfCjVDDu0M=","LgIzwotu","GMKDG8O5KsOHwrk+GsOWKMOUeXUyc2l6WcKYZ8OLw4/CkTFBw6fDrX3DkzNv","B8OhwrcwOQ==","asKjwoTCn8Om","wrTCqsOTWcOC","YcObwpHCq1I=","DBvCtwVC","BMO9wpw+OgQ=","FcOiw6XCqcO5","R8K0Px5V","dMKxV8Kvw6M=","wrdIXcOKwp4=","LcOMBcKWYQ==","woQjUifCtkoCEcOGRsOQw7Mjw4zCrg==","G17DocOOYw==","asOkw51QwpvDvhQ=","wq8hYMOww48=","w5bDum/CucK2","wpItw5h/SA==","IVnDpsOxfw==","UcOswr7CszQ=","woA2fcOQw4k=","bhPDnFrCuw==","DcK4w7fCh8OYWw==","NsKVw73CqMO+","QBZ3w5XDug==","wqnCtsOeKWI=","wr0qwqzCpsKh","U8KtwoXCnMKG","XMODwpzClS4=","PcOkwog0Gw==","UMOSwpTCig==","H8OzIcK9Wg==","w6vDiiRH","DsKKfsOKAQ==","UMK6Cj9twok=","JsKNw5fCpcOO","wqnDn8OPHS0=","wrjDksKmw7jDtw==","RTNqFcK2","woo9w69Rbg==","w4jDmGTClsKQ","J0B8wold","CsO/w7DCk8OOwpZBw5nCusOrw5U=","TsKFwoXCocKI","wroFwqzClcKQ","RjPDoVjCqw==","5Lm+HeS/q+WnghkPwpUwPRI=","w5waEAHCpQ==","PMO0w6VUNw==","w4HDi0fCvsK3","wofCjMO1RsOx","w6Frw64Lw5E=","eMOVwofCrko=","TsKXw6bCqkY=","ZRDDqU7CtQ==","ZMKXw77CqG8=","wq01w5DCucOf","ZsOvwpTCilk=","KcOrK8KTeQ==","STJwIcK9","w4YiKDbChA==","BwMdw4hj","EQE5wrVL","wqcswrLCvMKe","RMOow75Nwqw=","wpLDkMKqw5bDgw==","wqPCi8OrH2c=","J1rDmMO0ZA==","N2Jrw7DDlQ==","wqU6f8Olw64=","KEdWw5XDsg==","wrs7wpLCvcKL","bArDrGTCm2VTw77CpnME","K8Orw6JZCQ==","McOmw6Jgw5E=","Ki0ww4kZ","MG1owppe","w79Iwq/CuHc=","AsKZVRjCnQ==","AcKkeR3CiQ==","DcK/w57CgsOp","esOgw7t1wr4=","woUNw7xaRQ==","OsOpw6x4Tg==","wpkaw6nCpcOO","w4TDii1icQ==","NDQMw7Yd","woc3w5bCqMOo","KMO2w4pTSQ==","Y8O/wpLCt2I=","MWxVwoNV","wqA+RcOBw6U=","FcOSw5NrHw==","TcOGwqLCox4=","wq4CXnUi","ZwNoFcKZ","TDfDtXLCgA==","wqfCksO7a8O1","wrY5w6rCgMOZ","VsKqwqHCtMOC","wqghwpvCrcK0DQQ=","CsKQU8O1","GsOkw7/ClMOEwrVG","TxhdA8Kqwq/CosOUHg==","UsK2ECVtwovDjQ==","EzjCmQ==","ZMKPwpvCqMKLwrRO","exfDo3TCig==","w65IGCPDnxXCsA==","wpVIwopl","w4rDjSsCbVJo","Y8KFwpfCrsKD","asOkw4ZNwpvDqRPCmALCmlw=","wpBWQMONwr8=","U8OmwrTChzM=","w69UJjrDmw==","wqJBesOv","wpoXfUsz","IhIUw70t","w5RIw5wWw4I=","a8KXZMK/w58=","DsOCw5BpMw==","w53DqzAbTQ==","SxZrw7PDhw==","I2l1w5zDhg==","PU5vwoR2","wq1QGBdbwoIYdsK5FsKG","w6rDtS5/UA==","woRSEAdg","YMKSw73Cmmc=","ZsKQwoXCt8Kd","wqnChMO9PUA=","JcOzw5R9w4I=","wo4JRG8Q","wqc/w67CucOE","w4rDsA8yRA==","w5ADFiDCrQ==","ecOjw5xTwqY=","w4DDjzBkQw==","T8KvwqbChMOs","KcKdVjjCrsKtTz19w59p","wqvDncKDw4vDgg==","AMKfXijClQ==","K3RKwoRS","wpAqVyc=","woUtYsOGw6k=","wpzDvMO9AD4=","wqo0e8OBw74=","bBZiw7zDng==","ccKhdsK9w5k=","wpnDjcOoHxs=","w7c4HAvCmQ==","BcKSw6jCgsOW","XzlfFMK2","OF7DrA==","Eic+wqpi","ecKpOB94","wqpwBwZV","V8Kjd8KFw5s=","woHDsMOuOSM=","VRlfw6zDgg==","dcKvw4/CtnY=","MkTDpcOcQQ7CnzJxV2/Dk8O2MhXCiQ==","wpo6U8Omw4Y=","FSxGw4UZwojCiMKFUcOZdMOWw7Eaw4nCrB3CtcOqSzIuwp1DO8Ohw60ncsOkwr0ow4ppw7HChFgNwpHCi8OyAcOxwrLDplPCjhbCgMKycsKOwrEHPWUnEcOjAcKvJw==","wrvCu8OJTcOG","G8KxcQ/CjA==","wqIgwpzCqg==","wrnDmsOdPzE=","wqNZwpF5Ww==","J0ZDw7LDjg==","wroDQsO1w4E=","w6RJBiXDhA==","w7JOw5gww5E=","MsKdbzLClw==","QcOhwobCsFE=","VcK1w5zCkVg=","d8KWwp3CssOU","wppyPRB3","w7p2wpXCpkA=","wqYvw4dpaw==","T8O4wrfCgTU=","J8KoQcOxAw==","wpnCq8O1bcOx","K8OEw7JBCw==","VgHDg0TCqw==","RsORw5JPwq4=","c8OzwoDCvDY=","Nik+w50k","w5TDlV/CqsKB","LsKHw6PCkcOt","wqcDU8Onw6w=","S8KawpDCnMKd","wr/Dp8ODNyY=","LsOZw7TCgsOz","aMKMMxll","wpvDocO8BiY=","DS0Vw486","wptIwpFbTA==","wrvDocK/w7vDqA==","GcOvwosvGw==","woYdSwTCsg==","ZsKrVyEV","fi11EsKC","AMKtw6nCjMOV","TStIw7fDtw==","XCdKw63Dmg==","FMOAw6Znw64=","KsOgw7XCgsOA","acKgwqjCmsOP","LsOzO8KNYA==","DQUdwoZA","IMOew5zCqMOM","TBhLw4w=","PcKHTSDCiw==","IsKddzzCrw==","HsOUw7JP","wpXDjcKGw5rDvw==","BMOhGMKHdQ==","wpIXwrnClMKd","F8Otw7TCn8Ok","BDIqw5Q2","w49two3CkVg=","NcO0w4tdw6s=","w6jDviRSWA==","w5VUJiDDig==","wqMvw5xPRg==","a8KZwr7Cp8O1","BcKLW8O5McOAwqUkSMKJF8KINi1GeA==","w6F9PRrDlQ==","PcO2w4XDi8KMGcK0wp08S8OvES9QwoMpRsOlE8OuVMOdQD9bw4vCkRxXw581wqt6aHtjw4kVw58NYcONIFvDhcK8w5/Cp0/CnRLDqMKWSWDDogJZw4LCjsKZWw==","w73Dsz0ybA==","woBwHCBF","DCwzw4w=","woQYUg/Cqw==","GsOKw5vCn8Ox","wqEdw5RVSQ==","EFfDisOIUg==","IGlqwptN","asK1ScKEw6A=","w5J0wpHCr14=","wrPCm8OPbcOL","w4/DqR8mZw==","w7N0wpLCqHs=","w7LCnzfDhcOR","fTp9MMK3","w6LDnwZtaw==","wooOw4PClMOo","MWfDisOFUQ==","ScKXMSxq","GjXCpz90","w69QwpLCm0o=","w4jDkjUdew==","ScKjwobCocKn","JsKocwHCvw==","wpYkw41/SQ==","wqzDt8KZw7XDhA==","wpZMwot/","RsKsTwQ5","wo/DlcODFS0=","dsKEw57ChA==","CsOTGMKTSQ==","XcOtwpPCkxs=","wrZxOR5H","RBFHLsKJ","woFQwpR6Qg=="];!function(x,e){var w=function(e){for(;--e;)x.push(x.shift())};!function(){var x={data:{key:"cookie",value:"timeout"},setCookie:function(x,e,w,n){n=n||{};for(var _=e+"="+w,r=0,c=(r=0,x.length);r>(-2*_&6)):0)w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(w);return c});_0x34e6.CspWeK=function(x,e){for(var w,n=[],_=0,r="",c="",t=0,o=(x=atob(x)).length;t

    3. 中等混淆,最佳性能(官方文档)

    性能比没有模糊处理慢30-35%

     new JavaScriptObfuscator({
                compact: true,//压缩代码
                controlFlowFlattening: true,是否启用控制流扁平化(降低1.5倍的运行速度)
                controlFlowFlatteningThreshold: 0.75,应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
                deadCodeInjection: true,//随机的死代码块(增加了混淆代码的大小)
                deadCodeInjectionThreshold: 0.4,//死代码块的影响概率
                debugProtection: false,//此选项几乎不可能使用开发者工具的控制台选项卡
                debugProtectionInterval: false,//如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
                disableConsoleOutput: true,//通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
                identifierNamesGenerator: 'hexadecimal',//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
                log: false,
                renameGlobals: false,//是否启用全局变量和函数名称的混淆
                rotateStringArray: true,//通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
                selfDefending: true,//混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
                stringArray: true,//删除字符串文字并将它们放在一个特殊的数组中
                stringArrayEncoding: 'base64',
                stringArrayThreshold: 0.75,
                transformObjectKeys: true,
                unicodeEscapeSequence: false//允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
            }, []),
    
    

    构建后文件,文件大小:7066字节(6.90kb)

    var _0x1a25=["UmFzT1U=","RkVIc0o=","VUt2eW4=","Q29IS0g=","V1NSZ0k=","d3RNT2w=","dlV6cUw=","RlpzZWg=","QnpzSlE=","cXBqQ1k=","YXBwbHk=","bFZLNw==","Y3p1Ymo=","TFZlQXE=","Y2NKWlY=","cmV0dXJuIChmdW5jdGlvbigpIA==","e30uY29uc3RydWN0b3IoInJldHVybiB0aGlzIikoICk=","aVlYT1A=","OHw2fDV8MHwxfDN8Mnw0fDc=","ZndqZ3o=","ZHRYcU8=","YWduaWk=","VlZqV1g=","WktwZEE=","MXwzfDR8N3w2fDV8OHwyfDA=","QkZqaUQ=","VUNqbXU=","V213VEk=","anRJRUQ=","Mnw0fDB8NXwzfDZ8MQ==","aWhtV20=","WG5XbEg=","aWp6Z2c=","WkJuQ3o=","cEpUVWQ=","UVZ0V2U=","Y29uc29sZQ==","V2J1YVQ=","VE1Nck4=","c3BsaXQ=","bG9n","d2Fybg==","ZXJyb3I=","ZXhjZXB0aW9u","RmtNUE0=","aW5mbw==","dHJhY2U=","UWRZTnk="];!function(n,c){var b=function(c){for(;--c;)n.push(n.shift())};!function(){var n={data:{key:"cookie",value:"timeout"},setCookie:function(n,c,b,t){t=t||{};for(var x=c+"="+b,e=0,o=(e=0,n.length);e>(-2*x&6)):0)b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(b);return o}),_0x4bcb.NcPEgK=function(n){for(var c=atob(n),b=[],t=0,x=c.length;t

    4. 低混淆,高性能(官方文档)

    性能稍微慢于没有混淆

    new JavaScriptObfuscator({
                compact: true,//压缩代码
                controlFlowFlattening: false,//是否启用控制流扁平化(降低1.5倍的运行速度)
                deadCodeInjection: false,///随机的死代码块(增加了混淆代码的大小)
                debugProtection: false,//此选项几乎不可能使用开发者工具的控制台选项卡
                debugProtectionInterval: false,//如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
                disableConsoleOutput: true,//通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
                identifierNamesGenerator: 'hexadecimal',//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
                log: false,
                renameGlobals: false,//是否启用全局变量和函数名称的混淆
                rotateStringArray: true,//通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
                selfDefending: true,//混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
                stringArray: true,//删除字符串文字并将它们放在一个特殊的数组中
                stringArrayEncoding: false,
                stringArrayThreshold: 0.75,
                unicodeEscapeSequence: false//允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
            }, []),
    
    

    构建后文件,文件大小: 2,424 字节(2.36 KB)

    var _0x37a6=["exception","trace","console","个,你好,hello","lVK7","apply","return (function() ",'{}.constructor("return this")( )',"log","warn","debug","info","error"];!function(n,e){var o=function(e){for(;--e;)n.push(n.shift())};!function(){var n={data:{key:"cookie",value:"timeout"},setCookie:function(n,e,o,t){t=t||{};for(var r=e+"="+o,x=0,f=(x=0,n.length);x

    对比表格

    文件名称 文件大小 正常构建 无参数 高混淆 中混淆 低混淆
    index.js 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,//压缩,无换行
        controlFlowFlattening: false,//是否启用控制流扁平化(降低1.5倍的运行速度)
        controlFlowFlatteningThreshold: 0.75,//应用概率;在较大的代码库中,建议降低此值,因为大量的控制流转换可能会增加代码的大小并降低代码的速度。
        deadCodeInjection: false,//随机的死代码块(增加了混淆代码的大小)
        deadCodeInjectionThreshold: 0.4,//死代码块的影响概率
        debugProtection: false,//此选项几乎不可能使用开发者工具的控制台选项卡
        debugProtectionInterval: false,//如果选中,则会在“控制台”选项卡上使用间隔强制调试模式,从而更难使用“开发人员工具”的其他功能。
        disableConsoleOutput: false,//通过用空函数替换它们来禁用console.log,console.info,console.error和console.warn。这使得调试器的使用更加困难。
     
        domainLock: [],//锁定混淆的源代码,使其仅在特定域和/或子域上运行。这使得某人只需复制并粘贴您的源代码并在其他地方运行就变得非常困难。
        identifierNamesGenerator: 'hexadecimal',//标识符的混淆方式 hexadecimal(十六进制) mangled(短标识符)
        identifiersPrefix: '',//全局标识符添加特定前缀,在混淆同一页面上加载的多个文件时使用此选项。此选项有助于避免这些文件的全局标识符之间发生冲突。为每个文件使用不同的前缀
        inputFileName: '',
        log: false,//允许将信息记录到控制台。
        renameGlobals: false,//是否启用全局变量和函数名称的混淆
        reservedNames: [],//禁用模糊处理和生成标识符
        reservedStrings: [],//禁用字符串文字的转换
        rotateStringArray: true,//通过固定和随机(在代码混淆时生成)的位置移动数组。这使得将删除的字符串的顺序与其原始位置相匹配变得更加困难。如果原始源代码不小,建议使用此选项,因为辅助函数可以引起注意。
        seed: 0,
        selfDefending: false,//混淆后的代码,不能使用代码美化,同时需要配置 cpmpat:true;
        sourceMap: false,
        sourceMapBaseUrl: '',
        sourceMapFileName: '',
        sourceMapMode: 'separate',
        stringArray: true,//删除字符串文字并将它们放在一个特殊的数组中
        stringArrayEncoding: false,//编码的所有字符串文字stringArray使用base64或rc4并插入即用其解码回在运行时的特殊代码。true(boolean):stringArray使用编码值base64;false(boolean):不编码stringArray值;'base64'(string):stringArray使用编码值base64;'rc4'(string):stringArray使用编码值rc4。大约慢30-50%base64,但更难获得初始值。建议禁用unicodeEscapeSequence带rc4编码的选项以防止非常大的混淆代码。
        stringArrayThreshold: 0.75,//调整字符串文字将插入stringArray的概率
        target: 'browser',//您可以将混淆代码的目标环境设置为以下之一:Browser;Browser No Eval;Node
        transformObjectKeys: false,//是否启用混淆对象键
        unicodeEscapeSequence: false//允许启用/禁用字符串转换为unicode转义序列。Unicode转义序列大大增加了代码大小,并且可以轻松地将字符串恢复为原始视图。建议仅对小型源代码启用此选项。
    }
    
    

    问题

    1.报错

    在这里插入图片描述
    selfDefending: true,删除 或者 改成 false

    2.路径

    输入:Array或String默认值:[]
    捆绑名称是webpack编译后的输出文件名。使用多个webpack条目,您可以output使用别名[name]或对象在对象中设置包名称[id]。
    excludes数组的语法是multimatch包的语法。您可以在包页面上看到示例。
    几个语法示例: [‘excluded_bundle_name.js’, ‘**_bundle_name.js’] or ‘excluded_bundle_name.js’
    可用于绕过某些文件的混淆。

    注意文件路径

    	new JavaScriptObfuscator({
    	...
        }, 'static/js/me.js'),
    
    
    	new JavaScriptObfuscator({
    	...
    	}, ['static/js/me.js']),
    
    

    obfuscator-loader

    混淆代码会导致相当大的文件。最好只混淆您的代码,使第三方库无法进行模糊处理。如果您计划将代码和第三方代码拆分为不同的捆绑包,则使用插件很容易实现。看看webpack-obfuscator。

    有时您需要输出单个js包,但仍需要混淆某个特定模块的源代码。在这些情况下,加载器可以做到这一点。
    例如,我碰巧在我的一个项目中捆绑了一个大的第三方库(不是任何类型的模块,我不得不使用脚本加载器),并且我被要求混淆我的代码。

    安装

    npm install --save-dev obfuscator-loader

    配置

    在webpack配置中定义规则,并使用obfuscator-loader作为模块的最后一个加载器。您可以添加enforce:'post’标志以确保在正常加载器之后调用加载器:
    webpack.base.conf.js

    module.exports = {
      module: {
        rules: [
          {
            test: /\.js$/,
            include: [ path.resolve(__dirname, "justMySources") ],
            enforce: 'post',
            use: { loader: 'obfuscator-loader', options: {/* options here */} }
          },
        ]
      }
    };
    
    

    文档地址

    本文转自 https://blog.csdn.net/qq_31126175/article/details/86526237,如有侵权,请联系删除。