Js脚本加密思路解析

来源:互联网 发布:王勇平 知乎 编辑:程序博客网 时间:2024/06/05 16:01

Js脚本加密思路解析

纯粹的js脚本可以被下载到本地,从而把你辛辛苦苦写出来的代码据为已有,所以网上有很多加密js脚本的方法,然而高手们在研究加密方法的同时也指出,绝对的安全对js代码来说是不可能的,因为无论怎么加密,最终你要把加密后的代码通过解密过程在客户端的浏览器中运行起来。也就是说加密的过程可以不写在目标代码中,而解密过程则必须要写在代码中,否则浏览器没办法执行。

网上有另外一种办法,就是把js脚本嵌入到asp代码中,这种办法是否可行,我没有验证,因为我是phpapache等开源软件的拥护者,对asp不了解。后又从网上查到apache可以支持asp,终因还要装什么软件嫌太麻烦,没有实施。

经过苦苦思索和苦苦搜索,我终于形成了自己的一套js加密的思路,心中不敢懈怠,赶紧记录下来,恐怕这个思路被转瞬间遗忘。

先说加解密过程,如果有一种办法,能够使加解密过程依赖于一个外部数据,在不知道外部数据的情况下,即便是知道解密算法的情况下也很难破解,那么这个算法就是很安全的。这个外部数据也称为密钥,这种加密算法业界应该是很多的。不用那些已经载入史册的算法,自己现编一个都来得及。

现在重点回到了如何使用一个用户无法获取的外部数据的问题上来了。直接在js里面写字符串常量,不行,因为js代码是可以被客户端看到的,既能看到算法,也能看到密钥。那就要考虑从其它脚本语言中传给js,我第一个想到了phpphp脚本客户端是无法看到的,如果能从php传递一个字符串变量给js,那是再好不过的了,经过查找网络,说是有不少方法,结果看了之后发现,是用明码的方式传递的,传是传了,可以在js代码中也能看到,这就失去了它做为密钥的意义。其它语言我还不怎么会,暂时就到此为止,只能从js内部来找问题的解决方案了。

js的文档中找了许久,发现有一个属性可以利用,也就是document.file相关的属性,说具体了也就是文档的创建和修改时间,这个是用户无法知道的。当用户不知道这个密钥,想要破解这个算法,只能是利用所有可能的密钥一个一个地试,密界称之为暴力破解。想想可以有至少几百年的秒数的数字让暴力破解者来尝试,可想是很安全的。

正当我沾沾自喜时,一个念头滑过我的脑海,用户会不会能通过浏览器来得知文档的创建和修改时间呢?我赶紧打开浏览器在菜单中找啊找,果然,在文件->属性菜单中,弹出一个对话框,上面赫然列有当前浏览文档的创建和修改日期。这个方法面临被毙的危险,后来我实在没有找到文档的修改时间,也就是时分秒等数据,这才松了口气,不能用日期,还可以用时间,可以利用一天24小时内的任何一个时间。后来又想一天才上8个小时班,文档的修改时间肯定在这8个小时内,算了一下,可供暴力破解的数据为2万多,不保险,只要编个程序,2万多密钥一会儿就能试完,后来又一想,还可以把开发网页的机器时间调乱,比如调成半夜两点钟,这样可以把网页的创建时间修改为半夜的时间,这样必须要试到的数据又可以增加到24小时的秒数,达到8万多。达到这种程度,可以对付一般的用户了,因为使用一个稍微复杂一点的算法,比如,验证一个密钥用1秒钟时间,那很验证完所有的密钥需要一天时间,24个小时,再下下功夫,编一个验证一个密钥需要10秒钟时间的解密算法,那就需要10天来验证完所有可能的密钥,恐怕没几个人有那份耐心,况且我写的js代码也不值得花那很长时间来破解吧,呵呵。话说回来,10秒钟解析一个密码,对使用js程序的用户来说也几乎是一个极限了,因为一个网页从加载到完全打开,用户没有耐心去等待那么长的时间。需要验证的密钥多是多了,可还不保险。只能再想其它的办法。

再之后又找到一种办法,使用页面自动转向的办法,也就是用户键入一个地址时,加载这个网页,而这个网页又加载另外一个网页,同时,用写cookie的方式将数据传给后面加载的网页。我试了一下,很爽!这样一来,我可以在第一个网页中写上密钥,然后将这个密钥传给后一个网页。虽然写在前一个网页里,但是用户没办法查看前一个网页的源码,因为在加载第一个页面时,瞬间转向了后一个网页了。正当我准备庆祝时,保持冷静的一块大脑区域却给我敲响了另一个警钟:如果在IE浏览器中禁止执行js脚本的话,那么也就无法转向后一个页面了,那就可以查看第一个页面的源码了,密钥也就暴露无疑了。呵呵,胜利已经在不远处招唤我了,不用明码密钥,那干脆就再使用一次文档修改时间吧,两个页面的修改时间组合在一起,那就需要8万多再乘上8万多这么多的密钥需要验证。

在离胜利最近的地方,我又上网搜索了一下如何能查看网页的修改时间,以保万无一失,结果在一个不起眼的角落,有人做出如下结论,在地址栏中打入javascript:alert(document.lastmodified)就可以看到修改时间了,这被称做在地址栏执行脚本。我又被打了一闷棍!在地址栏上可以执行任何脚本,也就意味着可以查看document的任何信息,包括cookie,我的密钥也就没有任何秘密可言了,无奈中还是请出了网络,在一藏龙卧虎之站找到了屏蔽地址栏脚本的办法。

到目前为止,因为资历尚浅,没有遇到敌方(也就是破解方)的消息,暂且把这当做胜利吧!需要清醒地知道,这仅仅是暂时的胜利,真正高手是隐藏在互联网背后的,他们想看你的js文档信息,就像看自己的手心手背一样,不用说我这种雕虫小技,估计前面所说的用asp嵌入js代码的方式对他们来说,破解都不是问题。虽然如此,能够有一个自己的加密js的思路,能够对付较低级的破解者,还是值得庆贺的。