JS开发者,无论是前端,还是后端,都经常会用到JS代码保护。

众所周知,圈内有一个非常有名的网站:JShaman.com

这个网站是专注于JS代码安全领域的。主要功能是JS混淆加密。还有JS压缩、Html加密等等。

网站有商业功能,也有免费功能。

今天,就盘点一下该网站的免费功能,是很多JS开发者都用的到的。

1、免费JS加密

JS开发者【宝藏级网站】_ico

JS代码免费加密, 启用:局部变量混淆、正则表达式标准化、JSON对象标准化、数值转二进制表达式、布尔值一元式化、字符串Unicode化、字符串颠倒等功能。

加密效果:

(function(){var _0xa5dfa=(600868^600866)+(817585^817593);var _0xd4ab="\u006A\u0073\u0068\u0061\u006D\u0061\u006E\u002E\u0063\u006F\u006D";_0xa5dfa=(537394^537395)+(585995^585986);var _0xde35d=(805588^805584)+(823717^823714);var _0xacgd2a=814128^814033;_0xde35d=(568481^568487)+(399082^399085);var _0x63a=function(){return"\u0028\u0063\u0029"+_0xacgd2a+"\u002D"+new Date()['\u0067\u0065\u0074\u0046\u0075\u006C\u006C\u0059\u0065\u0061\u0072']()+"\u002C"+_0xd4ab;};var _0x832d2b=console['\u006C\u006F\u0067'];_0x832d2b(_0x63a());})();

在免费JS加密功能界面上,有一排链接,提供的是许多其它免费功能:

JS开发者【宝藏级网站】_3c_02

2、JS加密:U加密

 这是JShaman开源的JS加密工具,开源地址:

https://github.com/w2sft/ujiami

在线使用:

https://www.jshaman.com/tools/u-jiami.html

U加密,是一个编码式JS代码加密,将JS代码分割、Unicode编码化存储到数组中,使代码全部成为密文状态显示,执行时由eval调用,解密、重新编码。
加密后的代码中存在大量的u字符(unicode编码),所以命名为“U加密”。

JS开发者【宝藏级网站】_3c_03

 加密效果:

var u=[`\u0028\u0066\u0075\u006e\u0063\u0074\u0069\u006f\u006e`,`\u0028\u0029\u007b`,`\u0076\u0061\u0072`,`\u0064\u006f\u006d\u0061\u0069\u006e`,`\u0022\u006a\u0073\u0068\u0061\u006d\u0061\u006e\u002e\u0063\u006f\u006d\u0022\u003b`,`\u0066\u0072\u006f\u006d\u005f\u0079\u0065\u0061\u0072`,`\u0032\u0030\u0031\u0037\u003b`,`\u0063\u006f\u0070\u0079\u0072\u0069\u0067\u0068\u0074`,`\u0066\u0075\u006e\u0063\u0074\u0069\u006f\u006e\u0028\u0029\u007b`,`\u0072\u0065\u0074\u0075\u0072\u006e`,`\u0022\u0028\u0063\u0029\u0022`,`\u0022\u002d\u0022`,`\u0028\u006e\u0065\u0077`,`\u0044\u0061\u0074\u0065\u0029\u002e\u0067\u0065\u0074\u0046\u0075\u006c\u006c\u0059\u0065\u0061\u0072\u0028\u0029`,`\u0022\u002c\u0022`,`\u0064\u006f\u006d\u0061\u0069\u006e\u003b`,`\u0063\u006f\u006e\u0073\u006f\u006c\u0065\u005f\u006c\u006f\u0067`,`\u0063\u006f\u006e\u0073\u006f\u006c\u0065\u002e\u006c\u006f\u0067\u003b`,`\u0063\u006f\u006e\u0073\u006f\u006c\u0065\u005f\u006c\u006f\u0067\u0028\u0063\u006f\u0070\u0079\u0072\u0069\u0067\u0068\u0074\u0028\u0029\u0029`,`\u007d\u0029\u0028\u0029\u003b`];var u2=[0,1,2,3,5,7,9,11,13,14,15,19,21,22,24,26,29,31,32,33];var u3=`u6[0] u6[1]u6[2] u6[3] = u6[5]u6[2] u6[7] = u6[9]u6[2] u6[11] = u6[13]u6[14] u6[15] + u6[7] + u6[19] + u6[21] u6[22] + u6[24] + u6[26]};u6[2] u6[29] = u6[31]u6[32]u6[33]`;for(u5=0; u5<u.length; u5++){u3 = u3.replace(new RegExp("u6\\["+u2[u5]+"\\]","g"), u[u5].replace("`","").replace("`",""));}window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)](u3);

3、欧零加密

又一个JS加密工具,将JS代码单词分割并储到数组中,使代码全部成为密文状态显示,执行时由eval调用,解密、重新编码。

在线使用地址:

https://www.jshaman.com/tools/o0-jiami.html

加密效果:

(function(){let e = eval;let x = "(_o_____o_2 (){_o__0__o_____o_0 _o_____o_3 = _0__0__o_____o_4._o_____o_5_0__0_;_o_____o_0 _o_____o_6__o_____o_7 = _o_____o_8;_o_____o_0 _o_____o_9 = _o_____o_2(){_o__0__o_____o_10 _0__0_(_o_____o_11)_0__0_ + _o_____o_6__o_____o_7 + _0__0_-_0__0_ + (_o_____o_12 _o_____o_13)._o_____o_14() + _0__0_,_0__0_ + _o_____o_3;};_o_____o_0 _o_____o_1__o_____o_15 = _o_____o_1._o_____o_15;_o_____o_1__o_____o_15(_o_____o_9())_o__0_})();";let z = "";[["_9__6_","\\"] , ["_o__0_","\n"] , ["_0__0_","\""] , ["_0___o_","'"]].map(function(z){  x = x.replace(RegExp(z[0], "g"), z[1]);});z = "var,console,function,domain,jshaman,com,from,year,2017,copyright,return,c,new,Date,getFullYear,log".split(",");let y = z.length - 1;while(y > -1){  x = x.replace(RegExp("_o_____o_" + y, "g"), z[y]);  y--;}e(x);}())

4、32进制加密工具

免费在线使用:

https://www.jshaman.com/tools/base32-encode.html

可用于JS关键字加密,如Eval加密形式为:(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)。

加密示例1:
eval(alert(1)),将alert(1)进行32进制加密得到:
eval((10).toString(32)+(21).toString(32)+(14).toString(32)+(27).toString(32)+(29).toString(32)+"("+"1"+")")

加密示例2:
window["eval"](alert(1))将eval、alert(1)分进行32进制加密得到:
window[(14).toString(32)+(31).toString(32)+(10).toString(32)+(21).toString(32)]((10).toString(32)+(21).toString(32)+(14).toString(32)+(27).toString(32)+(29).toString(32)+"("+"1"+")"+";");

5、Html加密

https://www.jshaman.com/tools/html-jiami.html

JS开发者【宝藏级网站】_3c_04

 这是加密Html源码的,这个功能不免费,但效果确实不错,顺带也简单介绍一下。

例如,Html源码:

<html>
    <head><title>测试</title></head>
    <body>
        <h1>Html源码加密</h1>
        <script>
            alert("加密测试");
        </script>
    </body>
</html>

加密后能变成:

<script>
function decodeUnicodeEntities(encodedStr){
return encodedStr.replace(/&#x([0-9a-fA-F]+);/g, function(match, hexValue){
return String.fromCharCode(parseInt(hexValue, 16));
});
}
let encodedString = "&#x003c;&#x0068;&#x0074;&#x006d;&#x006c;&#x003e;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x003c;&#x0068;&#x0065;&#x0061;&#x0064;&#x003e;&#x003c;&#x0074;&#x0069;&#x0074;&#x006c;&#x0065;&#x003e;&#x6d4b;&#x8bd5;&#x003c;&#x002f;&#x0074;&#x0069;&#x0074;&#x006c;&#x0065;&#x003e;&#x003c;&#x002f;&#x0068;&#x0065;&#x0061;&#x0064;&#x003e;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x003c;&#x0062;&#x006f;&#x0064;&#x0079;&#x003e;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x003c;&#x0068;&#x0031;&#x003e;&#x0048;&#x0074;&#x006d;&#x006c;&#x6e90;&#x7801;&#x52a0;&#x5bc6;&#x003c;&#x002f;&#x0068;&#x0031;&#x003e;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x003c;&#x0073;&#x0063;&#x0072;&#x0069;&#x0070;&#x0074;&#x003e;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0022;&#x52a0;&#x5bc6;&#x6d4b;&#x8bd5;&#x0022;&#x0029;&#x003b;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x0020;&#x003c;&#x002f;&#x0073;&#x0063;&#x0072;&#x0069;&#x0070;&#x0074;&#x003e;&#x000a;&#x0020;&#x0020;&#x0020;&#x0020;&#x003c;&#x002f;&#x0062;&#x006f;&#x0064;&#x0079;&#x003e;&#x000a;&#x003c;&#x002f;&#x0068;&#x0074;&#x006d;&#x006c;&#x003e;&#x000a;";
let decodedString = decodeUnicodeEntities(encodedString);
document.write(decodedString);
</script>

或者:

<html>
    <head><title>&#27979;&#35797;</title></head>
    <body>
        <h1>Html&#28304;&#30721;&#21152;&#23494;</h1>
        <script>
            alert("&#21152;&#23494;&#27979;&#35797;");
        </script>
    </body>
</html>

 这两个加密结果,是可以直接保存成Html使用的,跟加密前一样,是可以直接打开的Html。

6、JSON加密

https://www.jshaman.com/tools/json-encode.html

使用“JSON对像Key值标准化、字符串Unicode化、数值字面量转二元表达式、布尔字面量转一元表达式”等技术,对JSON数据进行加密。 

JS开发者【宝藏级网站】_3c_05

JSON加密效果:

{
  "\u006B\u0065\u0079\u0031": [!![], ![], null],
  "\u006B\u0065\u0079\u0032": {
    "\u006B\u0065\u0079\u0032\u0053\u0075\u0062": [526516 ^ 526517, 1.2, 805609 ^ 805611, "\u0033", 1e10, 1e-3]
  },
  "\u006B\u0065\u0079\u0033": ![],
  "\u006B\u0065\u0079\u0034": "\u006A\u0073\u0068\u0061\u006D\u0061\u006E\u002E\u0063\u006F\u006D"
}

JS代码中的JSON对像,或JS加载的单独外部JSON文件,都可进行加密。
加密后的JSON,可以直接使用,与加密前一样。

7、 前端JS语法标准化

将前端浏览器特有的语法进行标准化、统一化处理。例如:alert、console转化为:window.alert、window.console。

免费在线使用:

https://www.jshaman.com/tools/browser-js.html

什么要这样做?

原因1、统一规范化之后,源码更工整、易维护。

原因2、利于JS代码混淆加密,例如:alert(1),如仅对此一句代码加密,由于它会被示例全局顶层函数,出于代码稳定性考虑,通常是无法进行加密的,它不利于混淆加密,混淆加密后的代码中仍然显示为alert。
而alert是浏览器对象模型,可以显示的将其写为window.alert(1),如此它便成了window的成员函数调用方式,便可进行加密,加密后代码中将不会出现alert字符串。

8、JS字符串转Unicode

将字串转化为Unicode转义序列形式。
可用来来eval等语句结合,实现代码加密、反调试。

例如,定义变量key的值为123:“var key = 123;”
转化为Unicode形式为:

\u0076\u0061\u0072\u0020\u006b\u0065\u0079\u0020\u003d\u0020\u0031\u0032\u0033\u003b\u000a

如果此时用Eval执行,并用console.log输出变量key的值:

eval("\u0076\u0061\u0072\u0020\u006b\u0065\u0079\u0020\u003d\u0020\u0031\u0032\u0033\u003b\u000a");
console.log(key)

会发现:变量的值可以正常输出为123,但从代码中看不到“key”的定义,也无法通过调试找到“key”。
这样就起到了对变量名的保护。
此技巧可用于加密敏感信息相关的变量名、某些前端算法的密钥,等等。

在线免费使用:

https://www.jshaman.com/tools/string-unicode.html

扩展思路:不仅仅是字符串,也可以转化代码哦<(^-^)>

9、new表达式加密

将new Date()、new RegExp()、new Object()等new形式的语法进行加密,使new表达式在JS代码中不可见。

使用场景:只对特定JS代码(new表达式)进行针对性加密、加密特征不明显,是一种“轻度JS加密”,可用于“防御性编程”目的。

免费在线使用:

https://www.jshaman.com/tools/new-encode.html

JS开发者【宝藏级网站】_ico_06

例如代码:

// 1. new Array()
let arr = new Array('apple', 'banana', 'cherry');
console.log(arr); // 输出: ['apple', 'banana', 'cherry']

// 2. new Boolean()
let boolObj = new Boolean(false);
console.log(boolObj.valueOf()); // 输出: false

// 3. new Number()
let numObj = new Number(42);
console.log(numObj.toString()); // 输出: "42"

// 4. new String()
let strObj = new String("Hello");
console.log(strObj.toUpperCase()); // 输出: "HELLO"

// 5. new Object()
let obj = new Object({ name: "Alice", age: 25 });
console.log(obj.name); // 输出: Alice

// 6. new Function()
let func = new Function('a', 'b', 'return a + b');
console.log(func(3, 4)); // 输出: 7

// 7. new RegExp()
let regex = new RegExp('\\d+', 'g');
console.log(regex.test('123 abc')); // 输出: true

// 8. new Error()
try {
    throw new Error("Something went wrong");
} catch (e) {
    console.log(e.message); // 输出: Something went wrong
}

// 9. new Promise()
let promise = new Promise((resolve, reject) => resolve('Success!'));
promise.then(value => console.log(value)); // 输出: Success!

// 10. new Map()
let map = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(map.get('key1')); // 输出: value1

// 11. new Set()
let set = new Set(['red', 'green', 'blue']);
set.add('yellow');
console.log(set.has('yellow')); // 输出: true

// 12. new WeakMap()
let weakMap = new WeakMap();
let objKey = {};
weakMap.set(objKey, "value");
console.log(weakMap.get(objKey)); // 输出: value

// 13. new WeakSet()
let weakSet = new WeakSet();
let objForWeakSet = {};
weakSet.add(objForWeakSet);
console.log(weakSet.has(objForWeakSet)); // 输出: true

// 14. new Date()
let date = new Date();
console.log("当前日期和时间: " + date.toString());
// 创建一个表示特定日期和时间的Date对象
let specificDate = new Date(2024, 11, 25, 18, 0, 0); // 注意:月份是从0开始计数的,即11代表十二月
console.log("指定日期和时间 (年, 月-1, 日, 小时, 分钟, 秒): " + specificDate.toISOString());

 加密后的代码会成为:

let arr = eval(String.fromCharCode(110, 101, 119, 32, 65, 114, 114, 97, 121, 40, 39, 97, 112, 112, 108, 101, 39, 44, 32, 39, 98, 97, 110, 97, 110, 97, 39, 44, 32, 39, 99, 104, 101, 114, 114, 121, 39, 41));
console.log(arr);
let boolObj = eval(String.fromCharCode(110, 101, 119, 32, 66, 111, 111, 108, 101, 97, 110, 40, 102, 97, 108, 115, 101, 41));
console.log(boolObj.valueOf());
let numObj = eval(String.fromCharCode(110, 101, 119, 32, 78, 117, 109, 98, 101, 114, 40, 52, 50, 41));
console.log(numObj.toString());
let strObj = eval(String.fromCharCode(110, 101, 119, 32, 83, 116, 114, 105, 110, 103, 40, 34, 72, 101, 108, 108, 111, 34, 41));
console.log(strObj.toUpperCase());
let obj = eval(String.fromCharCode(110, 101, 119, 32, 79, 98, 106, 101, 99, 116, 40, 123, 10, 32, 32, 110, 97, 109, 101, 58, 32, 34, 65, 108, 105, 99, 101, 34, 44, 10, 32, 32, 97, 103, 101, 58, 32, 50, 53, 10, 125, 41));
console.log(obj.name);
let func = eval(String.fromCharCode(110, 101, 119, 32, 70, 117, 110, 99, 116, 105, 111, 110, 40, 39, 97, 39, 44, 32, 39, 98, 39, 44, 32, 39, 114, 101, 116, 117, 114, 110, 32, 97, 32, 43, 32, 98, 39, 41));
console.log(func(3, 4));
let regex = eval(String.fromCharCode(110, 101, 119, 32, 82, 101, 103, 69, 120, 112, 40, 39, 92, 92, 100, 43, 39, 44, 32, 39, 103, 39, 41));
console.log(regex.test('123 abc'));
try {
  throw eval(String.fromCharCode(110, 101, 119, 32, 69, 114, 114, 111, 114, 40, 34, 83, 111, 109, 101, 116, 104, 105, 110, 103, 32, 119, 101, 110, 116, 32, 119, 114, 111, 110, 103, 34, 41));
} catch (e) {
  console.log(e.message);
}
let promise = eval(String.fromCharCode(110, 101, 119, 32, 80, 114, 111, 109, 105, 115, 101, 40, 40, 114, 101, 115, 111, 108, 118, 101, 44, 32, 114, 101, 106, 101, 99, 116, 41, 32, 61, 62, 32, 114, 101, 115, 111, 108, 118, 101, 40, 39, 83, 117, 99, 99, 101, 115, 115, 33, 39, 41, 41));
promise.then(value => console.log(value));
let map = eval(String.fromCharCode(110, 101, 119, 32, 77, 97, 112, 40, 91, 91, 39, 107, 101, 121, 49, 39, 44, 32, 39, 118, 97, 108, 117, 101, 49, 39, 93, 44, 32, 91, 39, 107, 101, 121, 50, 39, 44, 32, 39, 118, 97, 108, 117, 101, 50, 39, 93, 93, 41));
console.log(map.get('key1'));
let set = eval(String.fromCharCode(110, 101, 119, 32, 83, 101, 116, 40, 91, 39, 114, 101, 100, 39, 44, 32, 39, 103, 114, 101, 101, 110, 39, 44, 32, 39, 98, 108, 117, 101, 39, 93, 41));
set.add('yellow');
console.log(set.has('yellow'));
let weakMap = eval(String.fromCharCode(110, 101, 119, 32, 87, 101, 97, 107, 77, 97, 112, 40, 41));
let objKey = {};
weakMap.set(objKey, "value");
console.log(weakMap.get(objKey));
let weakSet = eval(String.fromCharCode(110, 101, 119, 32, 87, 101, 97, 107, 83, 101, 116, 40, 41));
let objForWeakSet = {};
weakSet.add(objForWeakSet);
console.log(weakSet.has(objForWeakSet));
let date = eval(String.fromCharCode(110, 101, 119, 32, 68, 97, 116, 101, 40, 41));
console.log("当前日期和时间: " + date.toString());
let specificDate = eval(String.fromCharCode(110, 101, 119, 32, 68, 97, 116, 101, 40, 50, 48, 50, 52, 44, 32, 49, 49, 44, 32, 50, 53, 44, 32, 49, 56, 44, 32, 48, 44, 32, 48, 41));
console.log("指定日期和时间 (年, 月-1, 日, 小时, 分钟, 秒): " + specificDate.toISOString());

10、浏览器端Eval加密

将JS代码加密为Base64编码,并用Eval、atob解密执行。

免费在线使用:

https://www.jshaman.com/tools/browser-eval.html

JS开发者【宝藏级网站】_html_07

此外,还有:JS格式化、CSS格式化、随机密码生成器、二维码生成器、AAEncode加密、TS代码转JS代码、Html压缩等等工具,其中大部分是JS代码安全相,也有其它开发常用辅助功能。

这简直就是一个JS程序员的宝藏级网站,赶快收藏起来吧。