javascript 代码 简单加密的几个方法

简单加密的几个方法

在做网页时,最让人烦恼的是自己辛辛苦苦写出来的客户端IE运行的JS代码常常被别人轻易的拷贝,或者是让人容易从代码中获取到关键的网址或者内容进行攻击。于是对这些代码加密就出现了。但是因为JS代码是需要在浏览器解析运行的,要做到绝密是不可能的,所以只能对JS代码进行简单的加密,希望让居心叵测者知难而退。

网上流行的js加密就是把代码混淆或者把代码压缩。
代码混淆可以在这个网站实现:http://hao.360.cn/jiamijiemi.html
 
代码压缩,可以在这个网站实现: http://javascriptcompressor.com/
压缩不是最好的加密方法,压缩后一些关键的字眼还是能看到,所以一般运用代码混淆方法。混淆也就是颠倒是非、混淆黑白,无非就是去掉缩进、空格、空行和注释,改表代码中的非保留字为简单的字母、符号、乱码什么的,这样做只是为了加大代码的阅读难度,提高阅读成本,让一些普通用户不能简单的获取或者修改代码。下面列举五种常见的混淆代码方式。
 
一:通过编码方式
二:eval(function(p,a,c,k,e,r) 函数混乱方式
三:使用Microsoft出品的脚本编码器Script Encoder来进行编码
四:任意添加NUL空字符和无用内容混乱以及换行空格TAB方式
五:自写加密 解密函数方式
 
以加密下面简单的JAVASCRIPT代码为例:
alert(“你好”);
 
一:通过编码方式加密 (最简单的加密解密)
 
JAVASCRIPT函数里面有escape()和unescape(),encodeURI()和unencodeURI(),,encodeURIComponent()和unencodeURIComponetn();这三对函数进行字符串的编码解码,把代码编码后,就会出现像乱码一样的效果,这样就可以达到混淆的目的。比如例子代码用escape()函数加密后变为如下格式:
alert%28%22%u4F60%u597D%22%29%3B
 
当然,这样加密后的代码是不能直接运行的,需要用eval(codeString),这个函数的作用就是检查JavaScript代码并执行,必选项 codeString 参数是包含有效 JavaScript 代码的字符串值,加上上面的解码unescape(),加密后的结果如下:
<SCRIPT LANGUAGE=”JavaScript”>
var code=unescape(“alert%28%22%u4F60%u597D%22%29%3B “);
eval(code)
</SCRIPT>
 
而且 编码函数 还可以 进行二次,三次,n次,编码。
二次加密后 例子代码 变成:
alert%2528%2522%25u4F60%25u597D%2522%2529%253B
(escape解码编码的程序escape加密解密.html)
这样的加密虽然简单,但是因为要代码能运行,必须加上unescape,这样就非常容易被人知道用什么方式加密了。
 
二:eval(function(p,a,c,k,e,r) 函数混乱方式
 
NewMapServer里面的NewMapServerJsAPI.js 就是运用这种方法加密的。Function(p,a,c,k,e,r)就是一个混乱函数。
运用eval(function(p,a,c,k,e,r)加密例子 可以得到:
(function(p,a,c,k,e,d){e=function(c){return(c<a?”:e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!”.replace(/^/,String)){while(c–)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return’\\w+’};c=1};while(c–)if(k[c])p=p.replace(new RegExp(‘\\b’+e(c)+’\\b’,’g’),k[c]);return p}(‘0(“你好”);’,62,1,’alert’.split(‘|’),0,{}))
这种函数写法很多,但是比较容易破解,因为原理就在p=p.replace(new RegExp()) 这里,在这个函数调用之前 把p 读出来。例如用document.write(p); 就能得到没加密的内容了。而解密函数都是统一的,只要把/^/ 替换为”(也就是空字符),就可以解了。code = code.replace(/^/, ”);
 
(eval(function(p,a,c,k,e,r)加密解密代码在eval加密解密.html)
 
三:使用Microsoft出品的脚本编码器Script Encoder来进行编码
 
这种加密就是直接使用JavaScript调用控件Scripting.Encoder完成的编码!代码如下:
<SCRIPT LANGUAGE=”JavaScript”>
var Senc=new ActiveXObject(“Scripting.Encoder”);
var code='<SCRIPT LANGUAGE=”JavaScript”>\r\nalert(“你好”);\r\n<\/SCRIPT>’;
var Encode=Senc.EncodeScriptFile(“.htm”,code,0,””);
alert(Encode);
</SCRIPT>
 
编码后的结果如下:
#@~^FgAAAA==@#@&ls DD`J你好r#p@#@&FgMAAA==^#~@
 
这种加密虽然难看懂,但相应的解密工具早已出来,而且连解密网页都有了,而且ActiveXObject控件只有在IE支持。
(Script Encoder 加密解密代码 encode加密解密.html)
 
四:任意添加NUL空字符(十六进制00H)和无用内容混乱以及换行空格TAB方式
 
在HTML网页中任意位置添加任意个数的”空字符”,IE照样会正常显示其中的内容,并正常执行其中的JavaScript 代码,而添加的”空字符”我们在用一般的编辑器查看时,会显示形如空格或黑块,使得原码很难看懂,如用记事本查看则”空字符”会变成”空格”,利用这个原理加密结果如下:(其中显示的”空格”代表”空字符”)
<S C RI P T L ANG U A G E =” J a v a S c r i p t “>
 
a l er t (” 你   好”) ;
 
< / SC R I P T>
这样看起来也不太好看,但是作用不大。
在JAVASCRIPT代码中我们可以加入大量的无用字符串或数字,(只要个数字组和字符窜后面都有分号就可以,js里面会忽略这些数字和字符窜)以及无用代码和注释内容等等,使真正的有用代码埋没在其中,并把有用的代码中能加入换行、空格、TAB的地方加入大量换行、空格、TAB,并可以把正常的字符串用”\”来进行换行,这样就会使得代码难以看懂!如下:
<SCRIPT LANGUAGE=”JavaScript”>
“xajgxsadffgds”;1234567890
625623216;var $=0;alert//@$%%&*()(&(^%^
//cctv function//
(//hhsaasajx xc
/*
asjgdsgu*/
“你\
\
好”//ashjgfgf
/*
@#%$^&%$96667r45fggbhytjty
*/
//window
)
;”#@$#%@#432hu”;212351436
</SCRIPT>
这样的代码可读性和想读性都非常低。
 
 
五:自己写加密 解密函数方式
 
之前四种加密方式,各有各的好处,不过前三种都是在网上存在大量的破解方式,第四种自己加密起来比较复杂,对比较多的代码操作起来不方便。那么如果自己编写加密解密函数,就能一次解决上面的问题了。自己编写的思路有三种,一种是已知的加密解密方法混合;第二是已知的加密解密方法加上一些自编的函数;第三是完全自己编写一个加密解密方法。
这里我运用第二种方法,用一个自己编的函数改变字符,再用escape()函数编码。
原理就是: 先把代码的每个字符用charCodeAt(i)换成Unicode码,然后加上字符窜的长度,再用String.formCharCode(),把Unicode码换回字符。这样每个字符就不是原理的字符了。比如输入字符窜abc,那么a的Unicode码是97,加上长度3后,a通过转换就是e了。然后再用 escape() 来把改变后的字符进行escape编码。得出来的加密效果就不容易破解了,最少网上不能直接解密,而且操作起来简单。
 
(我写的加密解密代码 : myescape加密解密.html)
附:在实际工程中可以,这样操作,先用myescape加密解密.html把代码加密,然后把加密后的字符窜放到 eval(unencryption( )) 里面,这样就能正常运行了。这里需要加载encryption解密函数.js。
来自  http://wenku.baidu.com/link?url=HvQ6is5IxrbeWPh1UG9qhkNyrzh4K9sFNogsxbGzG–zfXD2RrupWilo0_8s2MiW0BHJ9YqdOWpXTzuyMF2Npx9zG0VRDuOlolQ2HKI7LgS
 

发表评论