前言
本文介绍的是源码加密的应用,我把它归纳在安全的知识方面,对于安全意识较高的公司来说是会有相应的处理的,当你的项目开发完成之后,将项目部署到服务器,你可能不想让别人看到你的源码,但又不想花钱的话可以试试下面介绍的几种方式。需要注意的是,由于下面介绍的几种插件都是开源的,所以安全的程度是相对的,只要花时间研究还是可以破解的。
对于应用场景
,我这里举个例子,可能废话比较多,有兴趣
可以看
,没兴趣
可以直接跳过
哈。
场景一
:假设你开发了一个项目,但版权在你的手里,现在有一家公司,想要购买你的项目,但没有买版权没有买源码,这时候你不想让该公司知道你的源码,就可以把源码给隐藏或者将代码混淆,当该公司想要自己组织团队进行二次开发时候,他们会发现没法在原有的代码上修改,除非来你手里买源码,这时候你又可以赚一笔源码费用了,如果你愿意的话。
场景二
:假设你开发了一个商城项目,只要你把商城发布到公网,就可能会被受到很多恶意的攻击,即使你在发布前做了很多安全的操作,但你无法规避所有的漏洞,可能在一段时间内你的是完全的,当你的网站越来越受欢迎的时候,可能会吸引更多的黑客来搞事情,他们会通过各种手段进入你的服务器,当你的服务器被闯入后,比较强大的黑客会分析你的源码然后在很隐蔽的地方插入一些不影响项目运行的代码,但会随着时间加速服务器的老化,直到项目无法正常使用,你只会觉得是用户流量越来越多,导致应用负担加重造成的,你可能会增加服务器的CPU,内存,以及磁盘空间,但没有更换项目源码,即使你的服务器已经很空闲,但依然会越来越查,导致用于体验越来越差,甚至有的会覆盖你的支付链接,将支付通道修改,但你不知道,但如果你的源码被加密了,其实想要往代码中加东西就要花费更多的时间,可能很长时间破解不了,就放弃了。但是如果你的服务器都被攻破了,即使你把源码加密了,个人认为已经没有什么区别了,因为这种场景下吸引黑客的可能已经不是你的代码了,可能是你服务器本身,当然你可以新建一个用户来启动项目,然后将用户的shell
权限给关闭,只留下一个启动的权限,另外除了日志或者图片文件保存的地址,可以把其他的所有目录都设置为没有操作权限,这样你的服务器相对来说安全一点点,另外就是代码本身的漏洞,这个就需要开发者自己来评判和测试了。
但即便你加密了业务代码,但其实加密代码是没有加密的,只要分析加密代码,破解也就是时间问题而已。在本文介绍的三种方式中只有proguard
只针对源码混淆,启动时不需要解密来还原代码,这种方式会导致可能无法启动项目,你需要花更多的时间来规避一些类的混淆,对于像我们只需要ctrl+c
ctrl+v
就能解决来说实在是太花时间了,可能你运气好启动没报错,但运行的时候就不一定会有这么好运了,我个人不是很推荐这种方式。然后第二种方式classfinal
,它主要是隐藏方法体,但实际上对于构造函数的方法体是没有隐藏的,并且类名方法名都是没有变化的,而proguard
会重命名包名、类名、属性名、方法名。最后是第三种方式xjar
,它比较彻底,直接加密整个jar
,将所有的class
以及配置文件以一种加密算法重新保存,但会暴露加密的代码,因为启动的时候需要解密所以需要自定义classloader
来加载class
并且还原配置文件,classfinal
和xjar
都是以这种方式来处理源码的。所以对于后两种方式可以分析加密算法破解也是时间问题。接下来请个位看官欣赏具体的操作步骤吧。
最后在这儿再啰嗦一句,以下的加密方式,源码都是开源的,所以在实际开发中是否选择,请自行评估,因为这些代码可能已经被无数的人分析过了,安全程度只是相对的,但是作为classloader
的源码学习我觉得吧还是有用的。
一、代码混淆【proguard
】
简明
将项目的包名、类名、方法名、属性名
用字母进行替换,并且同步修改方法体内的引用,但可以看到具体的实现,只是对于有严格命名规范的书写方式来说看起来很头疼,但花时间看还是能看明白。但是混淆之后再来启动jar
包的时候你会发现启动不了,然后又得去配置文件添加更多的配置来规避一些类,一次搞定还好,多配置几次还不能正常使用的话,可能就已经崩溃了,所以的话对于ctrl+c
、ctrl+v
习惯的来说,不推荐这种方式,当然有兴趣的可以去下载源码来分析,自己可以调整源码来达到你想要的效果。
1. 添加配置文件【proguard.cfg】
#指定Java的版本
-target 1.8
#proguard会对代码进行优化压缩,他会删除从未使用的类或者类成员变量等
-dontshrink
#是否关闭字节码级别的优化,如果不开启则设置如下配置
-dontoptim