为什么需要Java混淆?如何降低混淆对性能的影响?

可信Web系统离不开可信的前端环境,所以Java混淆在对抗黑客的过程中是必不可少的,这就是第二代Java代码混淆器Allatori Java obfuscator存在并广泛应用的原因。

在可信系统中,TPM的一个重要作用就是鉴别消息来源的真实性,保障终端的可信。而在Web系统中,我们的消息来源就是用户。随着撞库、恶意注册、薅羊毛等产业的蓬勃发展,在越来越多的场景中我们需要鉴别请求数据是否来自真实的用户,保护真实用户的数据安全。

所以想要构造一个Web系统中的TPM,首要问题就是需要保证输入数据安全,打造一个相对可信的前端环境。但是由于Web的开放特性,前端作为数据采集的最前线,js代码始终暴露在外,在这种情况下,防止恶意伪造请求变得非常困难,可信前端也就成了无稽之谈。

在反复对抗中,代码保护也就是通常意义上的Java代码混淆的重要性逐渐彰显出来。今天,小编就想和大家聊一聊Java混淆的问题。

为什么需要Java混淆

显而易见,是为了保护前端代码逻辑。

在Web系统发展早期,js在Web系统中承担的职责并不多,只是简单的提交表单,js文件非常简单,也不需要任何的保护。但随着js文件体积的增大,为了缩小js体积,加快http传输速度,开始出现了很多对js的压缩工具,比如uglify、compressor、clouser……它们的工作主要是:

  • 合并多个js文件

  • 去除js代码里面的空格和换行

  • 压缩js里面的变量名

  • 剔除掉注释

下图是压缩后的代码:

640.webp (2).jpg

虽然压缩工具出发点都是为了减少js文件的体积,但是人们发现压缩替换后的代码比源代码可读性差了很多,间接起到了代码保护的作用,于是压缩js文件成为了前端发布的标配之一。

但是后来市面上主流浏览器Chrome、Firefox等都提供了js格式化的功能,能够很快的把压缩后的js美化,再加上现代浏览器强大的debug功能,单纯压缩过的js代码对于真正怀有恶意的人,已经不能起到很好的防御工作,出现了”防君子不防小人”的尴尬局面。

chrome开发者工具格式化之后的代码:

640.webp (3).jpg

而在Web应用越来越丰富的今天,伴随着浏览器性能和网速的提高,js承载了更多的工作,不少后端逻辑都在向前端转移,与此同时也让更多不法分子有机可乘。在Web模型中,js往往是不法分子的第一个突破口。知晓了前端逻辑,不法分子可以模拟成一个正常的用户来实施自己的恶意行为。所以,在很多登录、注册、支付、交易等页面中,关键业务和风控系统依赖的js都不希望被人轻易的破解,Java混淆应运而生。

Java混淆是不是纸老虎

这是一个老生常谈的问题。实际上,代码混淆早就不是一个新鲜的名词,在桌面软件时代,大多数软件都会进行代码混淆、加壳等手段来保护自己的代码。Java和.NET都有对应的混淆器。黑客们对这个当然也不陌生,许多病毒程序为了反查杀,也会进行高度的混淆。只不过由于js是动态脚本语言,在http中传输的就是源代码,逆向起来要比打包编译后的软件简单很多,很多人因此觉得混淆是多此一举。

.NET混淆器dotFuscator:

640.webp (4).jpg

其实正是因为js传输的就是源代码,我们才需要进行混淆。因为暴露在外的代码没有绝对的安全,但是在对抗中,精心设计的混淆代码能够给破坏者带来不小的麻烦,也能够为防守者争取更多的时间。相对于破解来说,混淆器规则的更替成本要小得多,在高强度的攻防中,可以大大增加破解者的工作量,起到防御作用。从这个角度来讲,关键代码进行混淆是必不可少的步骤。

第二代Java代码混淆器Allatori Java obfuscator

现在,Java混淆经过多年升级迭代,大批第二代Java代码混淆器被推向世界,Allatori Java obfuscator也是其中之一。

与其他第二代Java代码混淆器相比,Allatori除保护功能之外,还附加了一系列的功能(如命名混淆、流程混淆、调试信息混淆、增量混淆、J2ME混淆、Android混淆、字符串加密、防止反编译、堆栈追踪、代码优化、水印等),几乎可以抵御一切的代码攻击。并且,Allatori可以让程序体积更小,速度更快,因此在世界范围的应用都很广泛。

免费下载Allatori Java obfuscator正式版>>>

16周年·技术服务月,软件商城优惠券不限量发放,购Allatori立省429元>>>

混淆对性能的影响

由于增加了废代码,改变了原有的AST,混淆对性能肯定会造成一定的影响,但是我们可以通过规则来控制影响的大小:

  • 减少循环混淆,循环太多会直接影响代码执行效率。

  • 避免过多的字符串拼接,因为字符串拼接在低版本IE下面会有性能问题。

  • 控制代码体积,在插入废代码时应该控制插入比例,文件过大会给网络请求和代码执行都带来压力。

通过一定的规则完全可以把性能影响控制在一个合理的范围内。实际上,有一些混淆规则反而会加快代码的执行,比如变量名和属性名的压缩混淆,会减小文件体积,对全局变量的复制会减少作用域的查找等等。在现代浏览器中,混淆对代码的影响越来越小,我们只需要注意合理的混淆规则,完全可以放心地使用混淆。

混淆的安全性

混淆的目的是保护代码,但是如果因为混淆影响了正常功能就舍本逐末了。

由于混淆后的AST已经和原AST完全不同,但是混淆后的文件和原文件执行结果必须一样,如何保证既兼顾了混淆强度,又不破坏代码执行呢覆盖的测试必不可少:

  • 对自己的混淆器写详尽的单元测试。

  • 对混淆的目标代码做高覆盖的功能测试,保证混淆前后代码执行结果完全一样。

  • 多样本测试,可以混淆单元测试已经完备了的类库,比如混淆 Jquery 、AngularJS等,然后拿混淆后的代码去跑它们的单元测试,保证和混淆前执行结果完全一样。

通过以上分析可以知道,可信Web系统离不开可信的前端环境,所以Java混淆在对抗黑客的过程中是必不可少的。同时,通过一些规则,混淆器对性能的影响也是可控的。


16周年·技术服务月,购正版Allatori Java obfuscator立省429元>>>

更多Allatori Java obfuscator资源,请点击【客服】了解

扫描关注“慧聚IT”微信公众号,及时获取最新动态及最新资讯

为什么需要Java混淆?如何降低混淆对性能的影响?

标签:

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年10月24日
下一篇 2019年10月24日

相关推荐

发表回复

登录后才能评论