安全地释放您的演示应用程序
上个月,我不得不为潜在客户开发概念验证Web应用程序。 一切正常,但是在会议结束时,客户问“当然您会给我们演示,以便我们可以自己进一步进行演示”。 我非常确定自己的技术,因此我对错误没有任何疑问,但是无论如何我还是拒绝了。 为什么这样? 因为我不想冒险让客户打开WAR,看看我是如何做到的。
之后,我花了很多时间思考如何可以做一些不同的事情,以便下次我将成为提议将演示交给客户的人。 以下是这些想法的结果。
在线托管
这是我立即选择的解决方案。 它认为它有很多缺点。
它有两个基本选择:将Web应用程序托管在您自己的基础结构上,或者将其托管在第三方的基础结构上。 将其托管在您的基础结构上是一个好主意,因为它可以满足您的需求。 但是,这需要一支有能力且愿意的IT团队。 使用第三方非常棘手,因为您基本上是在放弃责任和做事的能力。
此外,取决于您托管应用程序的位置和客户的位置,这可能会导致响应时间问题,从而对演示图像产生非常不利的影响。 请记住,这是一个POC,因此客户应该关注功能而不是性能。
混淆
可以很容易地反编译Java代码:我记得JDK中有一个工具,但是自从Java时代起,我就主要使用JAD 。
编译代码时只会丢失两件事:注释和参数名称; 类名,方法名和属性名由编译过程以及导入保留。 因此,反编译Java代码将为您提供大部分重要的东西。
几年前,我已经使用过混淆技术,以使承包商可以在现场使用专有框架,而不必担心使用yGuard产品进行代码反编译的风险。 yGuard让您定义您的API,并将其保留。 在编译的代码中,所有其他类及其关联的成员将使用gobbledygook重命名,例如a,b,string等。 用yGuard混淆的代码很难(但并非不可能)阅读。
无论使用yGuard还是其他工具进行混淆,都有三个主要缺点。 首先,您必须定义您的API,这意味着您必须手动逐个设置应用程序的所有入口点。 这些入口点是所有超出混淆器范围且引用您的类的文件:
- 对于标准应用,这意味着主要类别
- 对于Web应用程序,这意味着servlet
- 对于Spring应用程序,这意味着Spring bean定义文件引用了bean。
- 等等
此外,由于混淆器仅适用于Java引用,因此不适用于String,因此您可以再见所有反射代码。 当然,并非所有应用程序都如此,但是如果您考虑将来对代码进行混淆,则意味着对设计的限制。
最后但并非最不重要的一点是,如今大多数应用程序都是通过配置文件完成的。 我在上面写过关于Spring的文章,但是它也包含属性文件,部署描述符等。 这些文件不在混淆器的范围内,但是它们可以使您对代码本身有个很好的了解。 当然,对于Spring文件,您也可以使用批注,但这是从一开始就必须考虑的另一个约束。
现在换个完全不同的东西
很抱歉,此Monty Python参考资料 ...然而,从以前的可能性中可以看出,确实需要传统路线之外的其他东西。
到目前为止,我唯一真正满意的是Excelsior的Jet产品 。 它会生成一个完全独立的可执行文件(Windows是一个版本,Linux是一个版本)。 与反编译简单的Java字节码相比,反编译这种代码确实要花费更多的精力。 从我的角度来看,我并不认为这是不可能的(我对计算机一无所知),但在大多数情况下不值得为此付出努力。
使用JET是在两个应用程序中完成的多步骤过程。
喷射
注意,JET使您可以从在Tomcat上运行的Web应用程序以及标准Java SE甚至是Eclipse RCP应用程序创建可执行文件!
JET的功能包括:
- 系统属性设置,这意味着您的可执行文件将根据需要进行配置
- 选择应用程序的最终格式:完全包含的可执行文件或带有附加库的可执行文件
- 在平台上集成:这样,可执行文件将以平台方式显示有关应用程序的信息
- 试用版时间到期(如果需要)
- 您的应用程序如何启动和运行:启动屏幕,图标和控制台
- 优化应用程序:通过虚拟运行,编译器可以查看应用程序的工作方式,并考虑其使用情况来执行提高其性能所需的操作
JetPack II
以JET想要的格式描述了项目之后,就该做真正的工作了:打包应用程序。
在这里您还可以:
- 选择将在您的应用程序中使用的其他组件,例如JRE本身。 这意味着您的应用程序实际上可以包含在完全独立的可执行文件中!
- 分离JRE的一个子集,并使其在您选择的Web服务器上可用。 这样,您只需打包使用的内容,然后准备其余内容以供下载
- 选择打包格式:安装程序或可执行文件本身
到目前为止,我发现唯一缺少的是JET不能直接提供Maven集成。 由于我不是每天都提供我的Web应用程序,因此我可以忍受...
结论
在尝试了三种选择(托管,混淆和JET)之后,我要说的是,我发现后者是到目前为止我工具箱中功能最强大的工具。
下次当我遇到一位客户要求我进行演示时,我不会为寻求正确的解决方案而head之以鼻,我会即时回答“当然”,因为知道JET会为我处理。
翻译自: https://blog.frankel.ch/safely-give-away-your-demo-applications/