谈到Web前端开发,我们首先想到的是在开发时必须使用的浏览器、HTML、CSS以及软件工具和编程语言。对于开发人员来说,我们这方面的专业知识非常丰富,前端的所有数据都是“不可信任的”,因为构成前端业务逻辑和交互界面的所有相关代码都可以被用户直接查看,因此我们无法保证从前端传送到后端的数据一定没有被用户修改过。
因此,有没有一种方法来加密前端领域中与业务相关的代码(如数据分析逻辑,验证逻辑这种,一般是java代码Script代码),以防止用户进行恶意修改?这篇文章将讨论这个问题。
说到"加密",我们自然会想到许多与"对称加密"、"不对称加密"和"散列加密"有关的算法,如AWS算法、RSA算法和MD5算法等。以传统的B-S模式为基础,前端经过公钥加密处理的数据,在后端服务器再通过相应的私钥进行解密以获得原始数据,但对于前端的业务代码来说,由于浏览器本身无法识别运行这种加密后的源代码,所以实际上,传统的加密算法并不能帮助我们解决“前端业务逻辑代码如何全部黑盒化”的问题。
因为不能完全隐藏前端业务逻辑代码的实际执行细节,所以我们可以采用另一种方法来“伪黑盒子”前端业务逻辑代码,从而“降低代码的可读性”。常用的方法如下:
众所周知,可以用于Web前端开发的第三方插件有:Adobefiash、java代码Applet和Srilverlight这种。因为历史的原因,我们在这里没有深入讨论基于第三方插件的前端商业代码加密方案。在这种网站中,Adobe将在2020年完全停止支持fiash技术,Chrome,Edge等浏览器也开始逐步阻止使用了fiash程序的网页,或者弹出相关警告。与此相近,微软的Srilverlight5将在2021年停止维护,并完全停止开发后续的新版本特性。并且,即使java代码Applet仍可继续使用,但与上世纪90年代末相比,现在已经很少人使用(不完全统计)。并且,运行基于JRE的需求也使Applet应用的运行成本大大增加。
密码混乱,我们一般所说的“降低源代码的可读性”的方法,是在现代前端开发过程中使用“代码混淆”。一般意义上的代码混乱可以压缩原始ASCII代码的体积,并用简短而无意义的标识符替换变量、常量名称等内容,这个步骤可以简单地理解为“非语义化”。拿“Uruiqn”和“GCC(GoogleClosureCompiler)”来说吧,这两个例子中,第一个是没有代码混乱的原始ECMAScript5源代码: