一种JAVA应用程序的加密方法及运行方法转让专利

申请号 : CN201710696153.8

文献号 : CN107480478B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 钟尚亮

申请人 : 钟尚亮

摘要 :

本发明公开了一种JAVA应用程序的加密方法及运行方法。首先检查JAVA虚拟机可执行文件和类加载基础器的完整性,再通过随机字符串的校验,确保执行文件检查器和类加载基础器之间的通讯安全,然后把第一密钥写入到类加载基础器的计算机程序输入流中,最后类加载基础器从计算机程序输入流获取第一密钥后,结合随机生成并供用户持有的第二密钥,加密JAVA应用程序的解码文件,并输出加密后的解码文件和第二密钥。运行时,同样先检查各模块的完整性,再确保通讯安全,最后使用获取第一密钥和用户输入的第二密钥对JAVA应用程序进行加载和解密。采用本发明实施例,即保障了JAVA应用程序的安全性,又确保了JAVA应用程序的高可移植性和兼容性。

权利要求 :

1.一种JAVA应用程序的加密方法,其特征在于,包括:

执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果;

所述执行文件检查器调用所述JAVA虚拟机,并向所述JAVA虚拟机传入第一参数,以使所述JAVA虚拟机启动所述类加载基础器;其中,所述第一参数包括:由所述执行文件检查器生成的随机字符串、加密指令和需加密JAVA应用程序的名称;

所述执行文件检查器通过TCP协议的端口,接收并校验由所述类加载基础器发送的所述随机字符串;

如果所述随机字符串通过校验,则所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流;其中,所述计算机程序输入流由所述类加载基础器根据所述JAVA虚拟机的输入流而生成;

若是,则所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于加密所述JAVA应用程序的第一密钥;

所述类加载基础器从所述计算机程序输入流获取所述第一密钥后,根据所述需加密JAVA应用程序的名称,读取所述需加密JAVA应用程序的字节码文件,并根据所述加密指令、所述第一密钥和第二密钥,加密所述字节码文件;其中,所述第二密钥是由所述类加载基础器生成的随机密钥;

所述类加载基础器输出加密后的字节码文件和所述第二密钥。

2.根据权利要求1所述的JAVA应用程序的加密方法,其特征在于,所述执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果,具体为:所述执行文件检查器分别计算所述JAVA虚拟机的可执行文件和类加载基础器的实时MD5值,并将所述实时MD5值与预设的MD5值进行比对,获得所述完整性检查结果,在完成一次比对后更新所述循环检查次数。

3.根据权利要求1所述的JAVA应用程序的加密方法,其特征在于,在所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于加密所述JAVA应用程序的第一密钥之后,所述执行文件检查器结束所述JAVA虚拟机可执行文件和所述类加载基础器的完整性循环检查。

4.根据权利要求1所述的JAVA应用程序的加密方法,其特征在于,所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流,具体为:当所述检查次数均超过一次,且所述完整性检查结果为所述JAVA虚拟机可执行文件和类加载基础器均没有被篡改时,所述执行文件检查器确定获取所述类加载基础器的计算机程序输入流;

否则,不获取所述类加载基础器的计算机程序输入流。

5.根据权利要求1所述的JAVA应用程序的加密方法,其特征在于,所述根据所述加密指令、所述第一密钥和第二密钥,加密所述字节码文件,具体为:使用预设的加密算法、所述第一密钥和所述第二密钥,加密所述字节码文件;

所述预设的加密算法包括:对称加密算法、非对称加密算法、或者由对称加密算法和非对称加密算法的混合使用得到的加密算法。

6.一种JAVA应用程序的运行方法,其特征在于,包括:

执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果;

所述执行文件检查器调用所述JAVA虚拟机,并向所述JAVA虚拟机传入第二参数,以使所述JAVA虚拟机启动所述类加载基础器;其中,所述第二参数包括:由所述执行文件检查器生成的随机字符串、解密指令、需解密JAVA应用程序的名称、运行所述JAVA应用程序的运行参数;

所述执行文件检查器通过TCP协议的端口,接收并校验由所述类加载基础器发送的所述随机字符串;

如果所述随机字符串通过校验,则所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流;其中,所述计算机程序输入流由所述类加载基础器根据所述JAVA虚拟机的输入流而生成;

若是,则所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于解密所述JAVA应用程序的第一密钥;

所述类加载基础器从所述计算机程序输入流获取所述第一密钥后,根据所述需解密JAVA应用程序的名称,加载所述需解密JAVA应用程序的字节码文件,并根据所述解密指令、所述第一密钥和第二密钥,解密所述字节码文件;其中,所述第二密钥是由用户输入;

所述类加载基础器根据所述JAVA应用程序的运行参数,运行解密后的所述JAVA应用程序。

7.根据权利要求6所述的JAVA应用程序的运行方法,其特征在于,所述执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果,具体为:所述执行文件检查器分别计算所述JAVA虚拟机的可执行文件和类加载基础器的实时MD5值,并将所述实时MD5值与预设的MD5值进行比对,获得所述完整性检查结果,在完成一次比对后更新所述循环检查次数。

8.根据权利要求7所述的JAVA应用程序的运行方法,其特征在于,在所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于解密所述JAVA应用程序的第一密钥之后,所述执行文件检查器结束所述JAVA虚拟机可执行文件和所述类加载基础器的完整性循环检查。

9.根据权利要求6所述的JAVA应用程序的运行方法,其特征在于,所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流,具体为:当所述检查次数均超过一次,且所述完整性检查结果为所述JAVA虚拟机可执行文件和类加载基础器均没有被篡改时,所述执行文件检查器确定获取所述类加载基础器的计算机程序输入流;

否则,不获取所述类加载基础器的计算机程序输入流。

10.根据权利要求6所述的JAVA应用程序的运行方法,其特征在于,根据所述解密指令、所述第一密钥和第二密钥,解密所述字节码文件;其中,所述第二密钥是由用户输入,具体为:使用预设的加密算法、所述第一密钥和所述第二密钥,解密所述字节码文件;

所述预设的加密算法包括:对称加密算法、非对称加密算法、或者由对称加密算法和非对称加密算法的混合使用得到的加密算法。

说明书 :

一种JAVA应用程序的加密方法及运行方法

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及一种JAVA应用程序的加密方法及运行方法。

背景技术

[0002] JAVA应用程序由于其高可移植性,被广泛应用在我们生活中的智能移动终端、PC端、网页站点等,而为了达到这种高可移植性,JAVA应用程序牺牲了自身编译的彻底性,由此而带来的安全隐患是JAVA应用程序容易被进行反向编译,造成用户数据、程序数据和程序源码泄露。而现有的解决方案主要包括:代码混淆、本地化技术(Java  native Interface,简称JNI)和代码加壳,但是这几种技术都不是最优解决方案。
[0003] 首先,代码混淆作为一种降低源码可读性的措施,保持着软件功能的同时改变JAVA代码的外观和结构。常见的JAVA代码混淆器有Java Obfuscator、Zelix KlassMaster、Cinnabar Canner、Jmangle Java类粉碎机、JavaGuard、JODE等等。但是,代码混淆不能确保JAVA程序的保密性,反向编译后仍然可以获得有一定代码质量的代码。其次,本地化技术是把JAVA代码的核心部分改编为由C/C++编写的功能模块,再使用JNI技术通过JAVA代码去调用该功能模块。最后,代码加壳是把JAVA代码直接通过编译、加密、压缩封装为本地的执行文件。后两种技术牺牲了JAVA程序本身的高可移植性和拓展性。
[0004] 因此,现有技术并没有即能防止JAVA应用程序的反向编译,又能确保JAVA应用程序的高可移植性和兼容性的解决方案。

发明内容

[0005] 本发明实施例提出一种JAVA应用程序的加密方法及运行方法,即保障了JAVA应用程序的安全性,又确保了JAVA应用程序的高可移植性和兼容性。
[0006] 本发明实施例提供一种JAVA应用程序的加密方法,包括:
[0007] 执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果;
[0008] 所述执行文件检查器调用所述JAVA虚拟机,并向所述JAVA虚拟机传入第一参数,以使所述JAVA虚拟机启动所述类加载基础器;其中,所述第一参数包括:由所述执行文件检查器生成的随机字符串、加密指令和需加密JAVA应用程序的名称;
[0009] 所述执行文件检查器通过TCP协议的端口,接收并校验由所述类加载基础器发送的所述随机字符串;
[0010] 如果所述随机字符串通过校验,则所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流;其中,所述计算机程序输入流由所述类加载基础器根据所述JAVA虚拟机的输入流而生成;
[0011] 若是,则所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于加密所述JAVA应用程序的第一密钥;
[0012] 所述类加载基础器从所述计算机程序输入流获取所述第一密钥后,根据所述需加密JAVA应用程序的名称,读取所述需加密JAVA应用程序的字节码文件,并根据所述加密指令、所述第一密钥和第二密钥,加密所述字节码文件;其中,所述第二密钥是由所述类加载基础器生成的随机密钥;
[0013] 所述类加载基础器输出加密后的字节码文件和所述第二密钥。
[0014] 进一步的,所述执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果,具体为:
[0015] 所述执行文件检查器分别计算所述JAVA虚拟机的可执行文件和类加载基础器的实时MD5值,并将所述实时MD5值与预设的MD5值进行比对,获得所述完整性检查结果,在完成一次比对后更新所述循环检查次数。
[0016] 进一步的,在所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于加密所述JAVA应用程序的第一密钥之后,所述执行文件检查器结束所述JAVA虚拟机可执行文件和所述类加载基础器的完整性循环检查。
[0017] 进一步的,所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流,具体为:
[0018] 当所述检查次数均超过一次,且所述完整性检查结果为所述JAVA虚拟机可执行文件和类加载基础器均没有被篡改时,所述执行文件检查器确定获取所述类加载基础器的计算机程序输入流;
[0019] 否则,不获取所述类加载基础器的计算机程序输入流。
[0020] 进一步的,所述根据所述加密指令、所述第一密钥和第二密钥,加密所述字节码文件,具体为:
[0021] 使用预设的加密算法、所述第一密钥和所述第二密钥,加密所述字节码文件;
[0022] 所述预设的加密算法包括:对称加密算法、非对称加密算法、或者由对称加密算法和非对称加密算法的混合使用得到的加密算法。
[0023] 相应地,本发明实施例还提供一种JAVA应用程序的运行方法,包括:
[0024] 执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果;
[0025] 所述执行文件检查器调用所述JAVA虚拟机,并向所述JAVA虚拟机传入第二参数,以使所述JAVA虚拟机启动所述类加载基础器;其中,所述第二参数包括:由所述执行文件检查器生成的随机字符串、解密指令、需解密JAVA应用程序的名称、运行所述JAVA应用程序的运行参数;
[0026] 所述执行文件检查器通过TCP协议的端口,接收并校验由所述类加载基础器发送的所述随机字符串;
[0027] 如果所述随机字符串通过校验,则所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流;其中,所述计算机程序输入流由所述类加载基础器根据所述JAVA虚拟机的输入流而生成;
[0028] 若是,则所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于解密所述JAVA应用程序的第一密钥;
[0029] 所述类加载基础器从所述计算机程序输入流获取所述第一密钥后,根据所述需解密JAVA应用程序的名称,加载所述需解密JAVA应用程序的字节码文件,并根据所述解密指令、所述第一密钥和第二密钥,解密所述字节码文件;其中,所述第二密钥是由用户输入;
[0030] 所述类加载基础器根据所述JAVA应用程序的运行参数,运行解密后的所述JAVA应用程序。
[0031] 进一步的,所述执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果,具体为:
[0032] 所述执行文件检查器分别计算所述JAVA虚拟机的可执行文件和类加载基础器的实时MD5值,并将所述实时MD5值与预设的MD5值进行比对,获得所述完整性检查结果,在完成一次比对后更新所述循环检查次数。
[0033] 进一步的,在所述执行文件检查器获取所述计算机程序输入流,并向所述计算机程序输入流写入用于加密所述JAVA应用程序的第一密钥之后,所述执行文件检查器结束所述JAVA虚拟机可执行文件和所述类加载基础器的完整性循环检查。
[0034] 进一步的,所述执行文件检查器根据所述循环检查次数和所述完整性检查结果,判断是否获取所述类加载基础器的计算机程序输入流,具体为:
[0035] 当所述检查次数均超过一次,且所述完整性检查结果为所述JAVA虚拟机可执行文件和类加载基础器均没有被篡改时,所述执行文件检查器确定获取所述类加载基础器的计算机程序输入流;
[0036] 否则,不获取所述类加载基础器的计算机程序输入流。
[0037] 进一步的,根据所述解密指令、所述第一密钥和第二密钥,解密所述字节码文件;其中,所述第二密钥是由用户输入,具体为:
[0038] 使用预设的加密算法、所述第一密钥和所述第二密钥,解密所述字节码文件;
[0039] 所述预设的加密算法包括:对称加密算法、非对称加密算法、或者由对称加密算法和非对称加密算法的混合使用得到的加密算法。
[0040] 实施本发明实施例,具有如下有益效果:
[0041] 本发明实施例提供的JAVA应用程序的加密方法及运行方法,首先检查JAVA虚拟机可执行文件和类加载基础器的完整性,再通过随机字符串的校验,确保执行文件检查器和类加载基础器之间的通讯安全,然后把第一密钥写入到类加载基础器的计算机程序输入流中,最后类加载基础器从计算机程序输入流获取第一密钥后,结合随机生成并供用户持有的第二密钥,加密JAVA应用程序的解码文件,并输出加密后的解码文件和第二密钥。运行时,同样先检查各模块的完整性,再确保执行文件检查器与类加载基础器之间的通讯安全,最后使用获取第一密钥和用户输入的第二密钥对JAVA应用程序进行加载和解密。相比于现有技术的代码混淆、本地化技术和代码加壳技术,本发明技术方案即保障了JAVA应用程序的安全性,又确保了JAVA应用程序的高可移植性和兼容性。

附图说明

[0042] 图1是本发明提供的JAVA应用程序的加密方法的一种实施例的流程示意图;
[0043] 图2是本发明提供的JAVA应用程序的运行方法的一种实施例的流程示意图。

具体实施方式

[0044] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0045] 参见图1,是本发明提供的JAVA应用程序的加密方法的一种实施例的流程示意图,该方法包括步骤101至步骤108。
[0046] 步骤101:执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果。
[0047] 在本实施例中,本发明的技术方案由两个模块组成,分别是执行文件检查器和类加载基础器。其中,执行文件检查器是计算机操作系统的可执行文件,类加载基础器是JAVA应用程序的字节码文件。
[0048] 在本实施例中,步骤101具体为:执行文件检查器分别计算所述JAVA虚拟机的可执行文件和类加载基础器的实时MD5值,并将所述实时MD5值与预设的MD5值进行比对,获得所述完整性检查结果,在完成一次比对后更新所述循环检查次数。本发明技术方案事先对JAVA虚拟机(因版本而异)、类加载基础器等两个文件进行MD5算法摘要,得到正确的两个MD5值,并把这两个值内置到执行文件检查器中。当执行文件检查器运行时,就会分两个线程不断的计算两个文件的实时MD5值,并拿实时MD5值与预设MD5值进行比对,以此来获得完整性检查结果。该完整性检查结果包括:文件没有被篡改和文件被篡改。在完成一次检查比对后,执行文件检查器更新循环检查次数。
[0049] 在本实施例中,在执行文件检查器获取计算机程序输入流,并向计算机程序输入流写入用于加密所述JAVA应用程序的第一密钥之后,执行文件检查器结束JAVA虚拟机可执行文件和类加载基础器的完整性循环检查。即本发明的循环检查从执行文件检查器运行开始,到执行文件检查器获取计算机程序输入流,并向计算机程序输入流写入第一密钥为止。本发明采用循环检查的目的是:由于循环检查的时间为从执行文件检查器运行开始,执行文件检查器获取类加载基础器的计算机程序输入流,到执行文件检查器向类加载基础器的计算机程序输入流写入第一密钥的过程为止,执行文件检查器能实时获知JAVA虚拟机的可执行文件和类加载基础器的完整性情况,当循环检查的结果显示JAVA虚拟机的可执行文件或者类加载基础器遭到篡改时,执行文件检查器不会向类加载基础器的计算机程序输入流写入第一密钥,这样就可以保证第一密钥不被泄漏,以实现保护第一密钥的效果。步骤102:
执行文件检查器调用JAVA虚拟机,并向JAVA虚拟机传入第一参数,以使JAVA虚拟机启动类加载基础器;其中,第一参数包括:由执行文件检查器生成的随机字符串、加密指令和需加密JAVA应用程序的名称。
[0050] 在本实施例中,执行文件检查器创建子线程来调用JAVA虚拟机,让JAVA虚拟机成为执行文件检查器的子进程(执行文件检查器可以获取JAVA虚拟机的计算机程序输出流和计算机程序输入流),同时向JAVA虚拟机传入第一参数,让JAVA虚拟机启动类加载基础器。第一参数包括:由执行文件检查器生成的随机字符串、加密指令和需加密JAVA应用程序的名称。该随机字符串由执行文件检器生成,并用于本次加密的校验。JAVA虚拟机启动类加载基础器时,将第一参数也传递给类加载基础器。
[0051] 步骤103:执行文件检查器通过TCP协议的端口,接收并校验由类加载基础器发送的随机字符串。
[0052] 在本实施例中,执行文件检查器通过监听TCP协议的端口(例如:6300端口),接收该随机字符串,从而确认类加载基础器是否被启动,是否为合法的类加载基础器。执行文件检查器在接收到随机字符串后,将其与本地生成的随机字符串进行比对,如果一致,则校验通过,否则,校验不通过。
[0053] 步骤104:如果随机字符串通过校验,则执行文件检查器根据循环检查次数和所述完整性检查结果,判断是否获取类加载基础器的计算机程序输入流;其中,计算机程序输入流由类加载基础器根据JAVA虚拟机的输入流而生成。如果是,则执行步骤105,否则,执行步骤108。
[0054] 在本实施例中,执行文件检查器根据循环检查次数和完整性检查结果,判断是否获取类加载基础器的计算机程序输入流,具体为:当检查次数均超过一次,且完整性检查结果为JAVA虚拟机可执行文件和类加载基础器均没有被篡改时,执行文件检查器确定获取类加载基础器的计算机程序输入流,执行步骤105;否则,不获取类加载基础器的计算机程序输入流,执行步骤108。计算机程序输入流的定义为从计算机内存流向计算机程序的数据,计算机程序输出流的定义为从计算机程序流向计算机内存的数据。
[0055] 在本实施例中,类加载基础器继承了ClassLoader类,并重写了findClass方法,根据JAVA虚拟机生成相应的计算机程序输入流。
[0056] 步骤105:执行文件检查器获取计算机程序输入流,并向计算机程序输入流写入用于加密JAVA应用程序的第一密钥。
[0057] 在本实施例中,第一密钥可以有用户自行设定,并预先存储在执行文件检查器中,可根据用户需求制定不同的第一密钥。
[0058] 步骤106:类加载基础器从计算机程序输入流获取第一密钥后,根据需加密JAVA应用程序的名称,读取需加密JAVA应用程序的字节码文件,并根据加密指令、第一密钥和第二密钥,加密字节码文件;其中,第二密钥是由类加载基础器生成的随机密钥。
[0059] 在本实施例中,根据加密指令、第一密钥和第二密钥,加密字节码文件,具体为:使用预设的加密算法、第一密钥和第二密钥,加密该字节码文件。预设的加密算法包括:对称加密算法、非对称加密算法、或者由对称加密算法和非对称加密算法的混合使用得到的加密算法。对称算法包括:DES、3DES、AES、IDEA和PBE系列等,非对称加密算法包括RSA、ElGamal等。用户可根据需求制定不同的加密算法。
[0060] 步骤107:类加载基础器输出加密后的字节码文件和第二密钥。
[0061] 在本实施例中,输出加密后的JAVA应用程序的字节码文件和第二密钥到计算机磁盘中,并把加密后的JAVA应用程序的字节码文件存储到一个用户自定义名称的文件夹中,类加载基础器不得在这个文件夹中。
[0062] 步骤108:结束加密。
[0063] 在本实施例中,类加载基础器完成加密后会自行删除该第一密钥,避免第一密钥的泄露,下次加密时会重新从执行文件检查器中获取,用户也可动态修改第一密钥,以提高加密安全性。
[0064] 相应地,本发明提供了一种JAVA应用程序的运行方法,参见图2,图2是本发明提供的JAVA应用程序的运行方法的一种实施例的流程示意图。该方法包括步骤201至步骤208,各步骤具体如下:
[0065] 步骤201:执行文件检查器循环检查JAVA虚拟机可执行文件和类加载基础器的完整性,获得循环检查次数和完整性检查结果。
[0066] 步骤202:执行文件检查器调用JAVA虚拟机,并向JAVA虚拟机传入第二参数,以使JAVA虚拟机启动所述类加载基础器;其中,第二参数包括:由执行文件检查器生成的随机字符串、解密指令、需解密JAVA应用程序的名称、运行JAVA应用程序的运行参数。
[0067] 步骤203:执行文件检查器通过TCP协议的端口,接收并校验由类加载基础器发送的随机字符串。
[0068] 步骤204:如果随机字符串通过校验,则执行文件检查器根据循环检查次数和完整性检查结果,判断是否获取类加载基础器的计算机程序输入流;其中,计算机程序输入流由类加载基础器根据JAVA虚拟机的输入流而生成;如果是,则执行步骤205,否则,执行步骤208。
[0069] 步骤205:执行文件检查器获取计算机程序输入流,并向计算机程序输入流写入用于解密JAVA应用程序的第一密钥。
[0070] 在本实施例中,步骤201至步骤205的具体实现方式与步骤101至步骤105基本相同,详细说明可见上文所述。
[0071] 步骤206:类加载基础器从计算机程序输入流获取所述第一密钥后,根据需解密JAVA应用程序的名称,加载需解密JAVA应用程序的字节码文件,并根据解密指令、第一密钥和第二密钥,解密字节码文件;其中,第二密钥是由用户输入。
[0072] 在本实施例中,需解密的JAVA应用程序存储在用户自定义名称的目录下,第二密钥由用户持有。在类加载基础器加载加密的含有main方法的JAVA程序的字节码文件时,类加载基础器先调用父类的loadClass方法去加载该字节码文件,由JAVA虚拟机的类加载双亲委派模型原理得知该字节码文件不会被类加载基础器调用父类的loadClass方法成功加载到,而由于该字节码文件只存放在用户自定义文件夹中(用户类加载基础器不得在这个文件夹中),所以父类的loadClass方法会调用类加载基础器中被重写的findClass方法去加载该字节码文件,重写的findClass方法通过识别JAVA程序的名称,从名称为已加密的用户类的文件夹(用户自定义文件夹)中读该字节码文件和供用户持有的第二密钥,然后使用第一密钥和第二密钥对加密的含有main方法的用户类字节码文件进行解密。
[0073] 步骤207:类加载基础器根据JAVA应用程序的运行参数,运行解密后的所述JAVA应用程序。
[0074] 在本实施例中,解密完成后,在重写的findClass方法中直接调用defineClass方法,把含有main方法的用户JAVA程序的字节码加载到JAVA虚拟机中。最后利用java语言的反射调用机制,用户类加载基础器通过调用用户JAVA程序的main方法并传入用户JAVA程序所使用的运行参数,使得用户JAVA程序正常运行起来(注意:用户JAVA程序中的类必须声明是公共的)。如果用户JAVA程序的main方法中使用到了其他的类(这里看作是目标类),若这个目标类不在存在于用户自定义的文件夹中,则这个目标类会被类加载基础器的父类的loadClass方法加载。反之,这个目标类会被类加载基础器中被重写的findClass方法加载。
[0075] 在本实施例中,用户JAVA程序成功运行起来之后,执行文件检查器通过子线程,获取子进程用户JAVA程序的计算机程序输入流,接着执行文件检查器通过另一子线程,获取子进程用户JAVA程序的计算机程序输出流,最后把获取到的计算机程序输入流和计算机程序输出流均显示在执行文件检查器的界面,由此让用户与用户JAVA程序进行交互。若用户JAVA程序拥有图形界面,则该用户JAVA程序的图形界面也会正常弹出,并且与用户进行交互。
[0076] 在本实施例中,解密后的JAVA应用程序不会输出到计算机磁盘中,只是动态加载到JAVA虚拟机中,进一步确保JAVA应用程序的安全性。类加载基础器是由基于JAVA编程语言的类加载双亲委派模型技术开发的模块,能自定义JAVA应用程序的字节码文件加载过程。
[0077] 步骤208:结束运行。
[0078] 本发明的技术方案与现有技术有着很大的不同,首先,对于代码混淆技术,经过代码混淆处理的JAVA程序,在被反编译之后依然能输出有一定代码质量的代码,拥有可读性的源码还是会暴露出来,而本发明采用直接对JAVA应用程序直接加密的办法,由于本发明可以兼容多种加密算法,所以可以杜绝JAVA程序真正字节码文件泄露的问题。其次,对于本地化技术和代码加壳技术,虽然两者都可以避免JAVA程序容易被进行反编译的问题,但是JAVA程序被其处理后,会出现低内聚、高耦合问题和平台兼容性问题,其完全破坏了JAVA程序与生俱来的高可移植性和高拓展性。而本发明的技术方案是直接对JAVA程序的字节码文件进行加密,运行加密字节码文件的过程全程在计算机内存完成,外部难以跟踪查看,从而解决了JAVA程序的字节码文件因为运行需要而暴露在硬盘中被反编译的问题。另外,对于高可移植性和高拓展性,本发明处理JAVA程序的字节码文件的流程对于JAVA虚拟机来讲是完全透明的,所以当软件维护者要维护JAVA程序是,仅仅需要考虑如何维护即可。修改完成后,再使用本发明技术方案对JAVA程序的源码进行编译加密就完成整个维护过程。如果使用本地化技术处理的话,软件维护者除了考虑如何维护外,还需要维护其他语言开发的功能模块,从而使得维护效率降低。最后,对于跨平台高兼容性,本发明适用于windows平台和linux平台,可以做到在windows平台上加密JAVA程序字节码文件,在linux平台上正常运行该加密的JAVA程序字节码文件,反之也可以,充分体现了JAVA程序经过一次编译后可以处处运行的特性。如果使用代码加壳技术处理,则软件开发者要根据不同的操作系统,用不同的技术去编译JAVA程序,会产生一系列的平台兼容性问题和维护扩展性问题。
[0079] 由上可见,本发明技术方案即保障了JAVA应用程序的安全性,又确保了JAVA应用程序的高可移植性和兼容性。
[0080] 本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于一计算机可读取存储介质中,该程序在执行时,可包括如上述各方法的实施例的流程。其中,所述的存储介质可为磁碟、光盘、只读存储记忆体(Read-Only Memory,ROM)或随机存储记忆体(Random Access Memory,RAM)等。
[0081] 以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。