900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 揭开JS加密解密的神秘面纱(1)

揭开JS加密解密的神秘面纱(1)

时间:2022-05-24 12:56:18

相关推荐

揭开JS加密解密的神秘面纱(1)

我们为什么需要JavaScript加密

在日常生活使用中,许多互联网公司,或者暴露到公网中的项目。他们的接口是毫无保护的状态的,如果你的项目业务中有一些敏感数据,或者有价值的数据。这时候网络中会有一部分人为了获取利益,用爬虫技术去爬你的项目数据,将你的数据化作己用。

而爬虫爬取你数据的一步就是解读你前端的JavaScript代码,获取到有用的接口数据,利用代码自动请求达到爬取数据的目的。看到了这里,相信你已经大概明白了为什么需要JavaScript加密技术来保护你的JS代码。

如果你的JavaScript代码,在经过了js加密算法加密后,你的前端js代码讲变得不可阅读,基本可以完全杜绝别人通过阅读你的JavaScript代码盗取你接口数据的行为。

JavaScript加密为我们做了什么

1.将容易阅读理解的Js代码转化成了程序员无法阅读的字符串,但保证了代码执行的最终结果不变,也就是加密前后功能一致。

2.让你的Js代码直可以在你的网站下运行,别人拿走也用不了

3.图谋不轨的程序员拿到你的js后试图破解,会发现各种关卡等着他,破解难度逐级递增。

4.代码加密后不可还原,即使有非常厉害的非法技术人员将代码破解后,拿到的也是无法看出业务目的的代码。保证了你手上Js源码的唯一性。

......太多不一一列举了

单纯的文字描述可能无法直观的体现出JS加密对你的代码与数据带来的安全感。给大家贴一个JS加密站加密后的代码。

这是未加密的源代码

var a={},b={}; (function(w, d) { w.info = "这是一个一系列js操作。"; d.warning = "如果您的JS里嵌套了PHP,JSP标签,等等其他非JavaScript的代码,请提取出来再加密。这个工具不能加密php、jsp等模版内容"; d.intro = "本工具由 提供接口。"; alert('我成功执行了!')})(a, b);

这是加密之后的源代码

;var encode_version = '.v5', xqdjv = '__0xea6c6', __0xea6c6=['wqLCvHHCgsKY','w7fCi8OgG8OA','CirCv3fDgU/DmS/CicOcwotlQTI=','DhbDtg==','54qP5p2g5Y+l776dwq7DheS8kOWslOack+W/jueppu+/iei+keisnOaXv+aPkOaLneS4kuebgeW1reS/sw==','w7PCl8Oy','EzLClmrDqg==','eCHCicKuGg==','PT7Dl3TDlg==','wrfDsMKRw57DmQ==','w4ZIVHzDmg==','w6LCsMKIwpE1','aUQqKzo=','ASDCuEfDtg==','TlbDj8KqHA==','6Lyn5pq85Lm75Lmv5LuC57CM5YuOVsKy5pO55L2o44O6','5aWN5p2V5oKV55mLwpvDh+mFoOW1teWkjuS7rzsowpDvvrfDr1PDsOahm+euuu++m+euieetkuWFmeS6rOmclMO3w5JAP0DDhMOmeMOqV+eZoOS6vueghe+9qeiumuaOmOWPgeWGrOadieWGgeWKnuWsnuOBm+i/oeS7seW3iOWHtuS5l+iDmOWKieWtm8KKRQzjgIxNYMK756yw5qmO54uR5YWb5a+u','5pyy5bau5YaU55eSwqhNw4bCoDfCn8KJbsOvLwDDj8KPw67Dm8K3FuaNtuS+kuaNkuWNu+OBtA==','w5HDrcOxwp8=','wrzCik5eJ3jDgQ==','B8OpwovChsKE'];(function(_0x1c35d3,_0x4a79b2){var _0x1bb5d4=function(_0x3dd956){while(--_0x3dd956){_0x1c35d3['push'](_0x1c35d3['shift']());}};_0x1bb5d4(++_0x4a79b2);}(__0xea6c6,0xb7));var _0x1872=function(_0x1efc4a,_0x5d0205){_0x1efc4a=_0x1efc4a-0x0;var _0x29c65f=__0xea6c6[_0x1efc4a];if(_0x1872['initialized']===undefined){(function(){var _0x2b4e2c=typeof window!=='undefined'?window:typeof process==='object'&&typeof require==='function'&&typeof global==='object'?global:this;var _0x4b8b19='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';_0x2b4e2c['atob']||(_0x2b4e2c['atob']=function(_0x16bb5c){var _0x5184ad=String(_0x16bb5c)['replace'](/=+$/,'');for(var _0x5f2d01=0x0,_0x5a04e7,_0x4dd037,_0x4e3d08=0x0,_0x19c939='';_0x4dd037=_0x5184ad['charAt'](_0x4e3d08++);~_0x4dd037&&(_0x5a04e7=_0x5f2d01%0x4?_0x5a04e7*0x40+_0x4dd037:_0x4dd037,_0x5f2d01++%0x4)?_0x19c939+=String['fromCharCode'](0xff&_0x5a04e7>>(-0x2*_0x5f2d01&0x6)):0x0){_0x4dd037=_0x4b8b19['indexOf'](_0x4dd037);}return _0x19c939;});}());var _0x42986f=function(_0x224ad2,_0x40270f){var _0x4111cb=[],_0x25bbcb=0x0,_0x12c732,_0x16cda5='',_0x42fb6e='';_0x224ad2=atob(_0x224ad2);for(var _0x2f1dc7=0x0,_0x475c7b=_0x224ad2['length'];_0x2f1dc7<_0x475c7b;_0x2f1dc7++){_0x42fb6e+='%'+('00'+_0x224ad2['charCodeAt'](_0x2f1dc7)['toString'](0x10))['slice'](-0x2);}_0x224ad2=decodeURIComponent(_0x42fb6e);for(var _0x1aea1e=0x0;_0x1aea1e<0x100;_0x1aea1e++){_0x4111cb[_0x1aea1e]=_0x1aea1e;}for(_0x1aea1e=0x0;_0x1aea1e<0x100;_0x1aea1e++){_0x25bbcb=(_0x25bbcb+_0x4111cb[_0x1aea1e]+_0x40270f['charCodeAt'](_0x1aea1e%_0x40270f['length']))%0x100;_0x12c732=_0x4111cb[_0x1aea1e];_0x4111cb[_0x1aea1e]=_0x4111cb[_0x25bbcb];_0x4111cb[_0x25bbcb]=_0x12c732;}_0x1aea1e=0x0;_0x25bbcb=0x0;for(var _0x2063a3=0x0;_0x2063a3<_0x224ad2['length'];_0x2063a3++){_0x1aea1e=(_0x1aea1e+0x1)%0x100;_0x25bbcb=(_0x25bbcb+_0x4111cb[_0x1aea1e])%0x100;_0x12c732=_0x4111cb[_0x1aea1e];_0x4111cb[_0x1aea1e]=_0x4111cb[_0x25bbcb];_0x4111cb[_0x25bbcb]=_0x12c732;_0x16cda5+=String['fromCharCode'](_0x224ad2['charCodeAt'](_0x2063a3)^_0x4111cb[(_0x4111cb[_0x1aea1e]+_0x4111cb[_0x25bbcb])%0x100]);}return _0x16cda5;};_0x1872['rc4']=_0x42986f;_0x1872['data']={};_0x1872['initialized']=!![];}var _0x1f8668=_0x1872['data'][_0x1efc4a];if(_0x1f8668===undefined){if(_0x1872['once']===undefined){_0x1872['once']=!![];}_0x29c65f=_0x1872['rc4'](_0x29c65f,_0x5d0205);_0x1872['data'][_0x1efc4a]=_0x29c65f;}else{_0x29c65f=_0x1f8668;}return _0x29c65f;};var a={},b={};(function(_0x54e1e3,_0x13f886){var _0x298d89={'WASLN':_0x1872('0x0','A8ro'),'ZeIIx':_0x1872('0x1','ejyu'),'muLMI':_0x1872('0x2','8HZt'),'anfXv':function _0x53316d(_0x3f783c,_0x31893a){return _0x3f783c(_0x31893a);}};_0x54e1e3[_0x1872('0x3','EEKJ')]=_0x298d89['WASLN'];_0x13f886[_0x1872('0x4','1j7i')]=_0x298d89['ZeIIx'];_0x13f886[_0x1872('0x5','R*YK')]=_0x298d89[_0x1872('0x6','ejyu')];_0x298d89[_0x1872('0x7','mr6O')](alert,'我成功执行了!');}(a,b));;(function(_0xf2d2ec,_0x3a361e,_0x5b2404){var _0x114b54={'skCtJ':'undefined','lmHKZ':function _0x3b3c16(_0x422a44,_0x5c03ca){return _0x422a44===_0x5c03ca;},'koQHT':_0x1872('0x8','BwPT'),'uxaBl':function _0x23ef98(_0x1467d1,_0xa954e3){return _0x1467d1===_0xa954e3;},'HPCYf':_0x1872('0x9','qvIf'),'ZUnQW':function _0x128766(_0x5dacb6,_0x351d09){return _0x5dacb6+_0x351d09;},'gsqKv':_0x1872('0xa','C0I6'),'aymYV':'删除版本号,js会定期弹窗'};_0x5b2404='al';try{_0x5b2404+=_0x1872('0xb','mr6O');_0x3a361e=encode_version;if(!(typeof _0x3a361e!==_0x114b54[_0x1872('0xc','BwPT')]&&_0x114b54[_0x1872('0xd','O$wl')](_0x3a361e,_0x114b54['koQHT']))){if(_0x114b54[_0x1872('0xe',')Bj$')](_0x114b54[_0x1872('0xf','vWUY')],_0x114b54[_0x1872('0x10','eA8o')])){_0xf2d2ec[_0x5b2404](_0x114b54[_0x1872('0x11','Irdl')]('删除',_0x114b54[_0x1872('0x12','cs11')]));}else{_0xf2d2ec[_0x5b2404](_0x114b54[_0x1872('0x13','BwPT')]);}}}catch(_0x43862a){_0xf2d2ec[_0x5b2404](_0x114b54[_0x1872('0x14','NkW5')]);}}(window));;encode_version = '.v5';

可以看出来,上面的代码经过加密后完全无法阅读了。

但是可以成功运行,你可以将上面加密后的代码丢到浏览器运行试试。

这还是老版本的sojson.v5加密方法,这个网站目前最新加密版本是sojson.v6加密。根据作者往年更新的进度,马上估计更新加密算法到sojson.v7了。

我们言归正传,简单讲讲这个加密的大致逻辑是什么,他是如何做到保护你的代码的,可能加密逻辑不一样,但是大致思路是一样的。我自己写了一个简单版的例子,可以作为参考。

String.prototype.diyEncode = function () {const r = [];for (let i = 0; i < this.length; i++) {r.push(this[i].charCodeAt());}return window.btoa(encodeURIComponent(r.join(',')))}String.prototype.diyDecode = function () {try{const code = decodeURIComponent(window.atob(this));return String.fromCharCode.apply(null,code.split(','));}catch(e){}}var c = 'function a(){ console.log("run") }';var ec = c.diyEncode();console.log(ec);console.log(eval(ec.diyDecode().concat('a();')));

JavaScript加密是如何保护你的js不被坏人轻易看透,并且保证执行结果一样的呢?

其实Js加密就是把你的代码字符串,通过特定的js加密算法进行一系列的计算后,然后通过一个解密函数将加密后的字符串还原成可以被浏览器识别执行的代码,然后运行。中间可能还包括特别其他手段,这里无法一一举例,这里直简单描述加密的一个简单逻辑。

上边代码中,我们通过diyEncode对需要保护的JavaScript代码进行加密处理。

然后在浏览器执行的时候又将字符串拿出来,用diyDecodejs加密字符串进行解密操作,解密后的字符串变成正常的js代码了,这时候通过JavaScript的原生函数eval(str)将字符串当成js代码来执行。

这中间其实还存在一些问题,比如爬虫作者找到了你的解密函数,就可以轻而易举的拿到你的源代码。这就是另外一个新的知识点了。在sojson.v6中这些问题都已经完全解决,破解难度相当大,加上作者每年都在更新js加密算法,可以说安全系数是非常可靠的。

最给给大家分享这个免费的JS加密站,有需要的可以拿去保存备用,也可以通过搜索js加密来找到这个站,今天的讲解就到这里啦,喜欢的可以点赞收藏,有什么疑问欢迎大家来评论,可以一起讨论,互相解决问题。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。