文章目录
一、js中常见的的混淆
1.最简单的混淆举例
最初级混淆,变量定义
// 定义目标值
var obj={
};
obj.A=1;
obj.B=2;
obj.C=3;
//将目标值得键值定义给另一个值
var xxx='A'
console.log(obj[xxx]) // 1
若多个量的时候,我们可以定义成一个数组,然后通过索引获取值
// 定义目标值
var obj={
};
obj.A=1;
obj.B=2;
obj.C=3;
//将目标值得键值放到一个数组
var arr=['A','B','C'];
console.log(obj[arr[1]]) // 2
但是列表中的值还是会直接暴露,因此我们写个方法将列表的值加密,例如使用浏览器自带的base64加密( btoa(val)加密,atob(val)解密)
// 定义目标值
var obj={
};
obj.A=1;
obj.B=2;
obj.C=3;
//将目标值得键值进行base64加密
var arr=['QQ==','Qg==','Qw=='];
var jiemi=function(val){
return atob(val)
}
console.log(obj[jiemi(arr[1])]) // 2
为了安全,我们也可将值进行加密。
2.常见的混淆
①eval混淆
-
定义: eval(string) ,可计算某个字符串,并执行其中的的 JavaScript 代码。 有返回值
-
使用举例:
// eval()函数使用举例 a=eval('(function xxx(){return "hello world"})()'); console.log(a) // hello world // 将上边的eval字体进行base64加密 xxx=btoa('(function xxx(){return "hello world"})()'); console.log(xxx) // KGZ1bmN0aW9uIHh4eCgpe3JldHVybiAiaGVsbG8gd29ybGQifSkoKQ== // 然后混淆的时候,可能就会放入加密的东西 console.log(eval(atob('KGZ1bmN0aW9uIHh4eCgpe3JldHVybiAiaGVsbG8gd29ybGQifSkoKQ==\n')));
-
缺点:想要运行字符串的值,只能通过明文的eval()函数执行,然后里面的字符串可能是多层加密的,我们通常在eval处下断点。
② AA混淆
js支持Unicode,因此支持Unicode里收录的所有国家语言,如果我们有的语言和我们定义的变量长得很相似(例如0和o),那么因此有了这种混淆。
进入https://www.sojson.com/jjencode.html网址
示例:console.log("hello world!");
③JJ混淆
进入https://www.sojson.com/aaencode.html网址
示例:console.log("hello world!");
④ jsfuck混淆
-
思想: jsfuck源于一门编程语言brainfuck,其主要的思想就是只使用8种特定的符号来编写代码。而jsfuck也是沿用了这个思想,它仅仅使用6种符号来编写代码。它们分别是**(、)、+、[、]、!。**
-
在js中,无论什么值加“”都会变成字符串
- 示例:
console.log("hello world!");
- 解决:推荐解密工具
二、了解常见的加密方式
1.对称加密算法
对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。
-
优点: 加密速度快
-
缺点: 密钥的传递和保存是一个问题,参与加密和解密的双方使用的密钥是一样的,这样密钥就很容易泄露。
-
常见算法:AES(128位、192位或256位)、DES(64位)、3DES
2.非对称加密算法
非对称加密算法是指加密和解密采用不同的密钥(公钥和私钥),因此非对称加密也叫公钥加密,是可逆的(即可解密)。公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。
- 优点: 加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从而降低了被破解的几率。
- 缺点: 加密速度慢
- 常见算法: RSA、DSA、ECC
3.线性散列算法
- 常见算法:MD5(常见32位/16位)、SHA1(40位)、HMAC
MD5单向的算法不可逆。MD5加密后的数据长度要比加密数据小的多,且长度固定,且加密后的串是唯一的。
4.Base64
- 组成:A-Z a-z 0-9 - + =
严格意义讲,Base64并不能算是一种加密算法,而是一种编码格式,是网络上最常见的用于传输8bid字节代码的编码方式之一。
5.小技巧
# 123456的md5加密32位
e10adc3949ba59abbe56e057f20f883e
# 123456的md5加密16位
49ba59abbe56e057
# 123456的base64加密
MTIzNDU2
# 123456的sha1加密
7c4a8d09ca3762af61e59520943dc26494f8941b
在常见的加密中,如果看到加密数据不是16位和32位的,且加密的数据中的字母最大为f,一般是非对称或者对称加密,因为他们是16进制加密