<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script> function myFunction(){ document.getElementById("demo").innerHTML="Hello World"; } var a = 62; function encode() { //加密 var code = document.getElementById('code').value; code = code.replace(/[\r\n]+/g, ''); code = code.replace(/'/g, "\\'"); var tmp = code.match(/\b(\w+)\b/g); tmp.sort(); var dict = []; var i, t = ''; for(var i=0; i<tmp.length; i++) { if(tmp[i] != t) dict.push(t = tmp[i]); } var len = dict.length; var ch; for(i=0; i<len; i++) { ch = num(i); code = code.replace(new RegExp('\\b'+dict[i]+'\\b','g'), ch); if(ch == dict[i]) dict[i] = ''; } document.getElementById('code').value = "eval(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}(" + "'"+code+"',"+a+","+len+",'"+ dict.join('|')+"'.split('|'),0,{}))"; } function num(c) { return(c<a?'':num(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36)); } function run() { eval(document.getElementById('code').value); } function decode() { //解密 var code = document.getElementById('code').value; code = code.replace(/^eval/, ''); document.getElementById('code').value = eval(code); } </script> </head> <body> <textarea id=code cols=80 rows=20> </textarea><br> <p>單擊按鈕觸發函數。</p> <button onclick="encode()">加密</button> <button onclick="decode()">解密</button> <p id="demo"></p> </body> </html>
網上的例子
測試了一下
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="a"></div> </body> <script> document.getElementById('a').innerHTML = "testContent"; </script> </html>
eval混淆以后
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <div id="a"></div> </body> <script> eval(function(p,a,c,k,e,d,aaa){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}(' 1.2(\'0\').3 = "4";',62,5,'a|document|getElementById|innerHTML|testContent'.split('|'),0,{})) </script> </html>
任然可以運行。
可以修改encode函數里面的的一些值,我試了,沒什么問題。
看加密算法的初衷是,想寫一個功能,想把核心邏輯的一塊代碼不被抄襲,但是javascript很難不被反編譯。但是常用的加密方式都是可以很容易就被反向破解的,所以研究一下加密算法,自己改一套加密算法,這樣破解難度就比較大。javascript既然能夠按照約定的格式加密,那么加密的時候,加入隨機生成的代碼段和變量值,和你自己寫的算法,就很難被反編譯了。(后台獲取還得防止代理篡改)。還可以把js的某一段代碼通過后台傳輸注入到頁面上面,而且根據用戶的值去生成,這樣換個人用同一套注入的前端代碼就不能匹配上,然后返回后端校驗,再多次返回,檢驗不通過,就無法運行代碼了。這是我的設想