一种Java源代码加解密的方法及装置的制作方法

文档序号:6363643阅读:183来源:国知局
专利名称:一种Java源代码加解密的方法及装置的制作方法
—种Java源代码加解密的方法及装置技术领域
本申请涉及网络技术领域,尤其涉及一种Java源代码加解密的方法及装置。
背景技术
反编译(Decompiling)是指高级语言源程序经过编译变成可执行文件,反编译就是逆过程,但是通常不能把可执行文件变成高级语言源代码,只能转换成汇编程序。计算机软件反向工程(Reverse engineering)也称为计算机软件还原工程,是指通过对他人软件的目标程序(可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,作为自己开发软件时的参考,或者直接用于自己的软件产品中。
Java语言由于跨平台等特性,生成的class文件非常容易被反编译软件反编译,导致源代码的泄露,这样对代码享有版权的公司或个人就无法有效的保证其软件不被非法破解和运行。
现有技术中,解决Java代码版权问题的方案主要有class加密方案和代码混淆方案,具体实现为:
(I) class加密方案,通过加密算法(例如AES等)对class文件进行加密,并通过自定义的ClassLoader在加载类的时候对文件进行解密。
AES (Advanced Encryption Standard)又称 Ri jndael 加密法,是美国联邦政府米用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
ClassLoader是指:当Java程序运行时,首先运行JVM (Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。
(2)代码混淆方案通过代码混淆软件,对软件的源代码进行混淆,导致反编译后的class文件不具备可读性。
代码混淆(Code Obfuscation)混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的情况下,即使被反编译,也难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。
上述两种现有技术的解决方案都无法对Java程序进行方便有效的运行控制,如果要运行控制,则需要开发者自己实现相应的运行控制代码,增加了开发者的负担。
另外,现有的class加密工具由于本身是基于ClassLoader实现,而ClassLoader是由Java代码实现,所以很容易通过修改JAVA程序字节码的方式破解,代码混淆只能单纯的对代码进行混淆或加密,而无法进行有效的运行控制。发明内容
本申请提供一种Java源代码加解密的方法及装置,本申请所提供的方法和装置解决现有技术中Java语言容易被反编译的问题。
一种Java源代码加密的方法,该方法包括:
对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;
将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件;
将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端通过发送请求获取所述授权文件后,应用所述Java类加载器解密所述授权文件,并将解密得到的函数的调用信息与所述抽取了函数调用逻辑的Java代码生成源代码文件。
一种Java源代码解密方法,包括:
当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求;
接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器;
当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
一种Java源代码加密装置,该装置包括:
函数抽取模块,用于对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;
包装函数生成模块,用于将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件;
加密文件生成模块,用于将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端通过发送请求获取所述授权文件后,应用所述Java类加载器解密所述授权文件,并将解密得到的函数的调用信息与所述抽取了函数调用逻辑的Java代码生成源代码文件。
一种Java源代码解密装置,该装置包括:
授权文件获取模块,用于当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求;
源代码生成模块,用于接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器,当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
上述技术方案中的一个或两个,至少具有如下技术效果:
本申请所提供的方法和装置通过抽取Java代码中的函数调用逻辑进行集中加密,使得任何的反编译手段失效。


图1为本申请实施例一种Java源代码加密的方法的流程图2为本申请实施例一种Java源代码解密方法的流程图3为本申请实施例一种Java源代码加密装置的结构示意图4为本申请实施例一种Java源代码解密装置的结构示意图5为本申请实施例一种Java程序运行控制系统的结构示意图。
具体实施方式
本申请实施例提供一种Java源代码加密的方法,该方法包括:对程序源代码进行逻辑抽出处理,得到源代码中的函数调用逻辑和抽取了函数调用逻辑的Java代码;在每个函数调用逻辑的原调用位置插入一个随机命名的第一函数,并对所述第一函数与所述函数调用逻辑的对应关系进行加密生成授权文件;将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端通过发送请求获取所述授权文件后,应用所述Java类加载器解密所述授权文件,并将解密得到的函数调用逻辑与所述抽取了函数调用逻辑的Java代码生成源代码文件。
如图1所示,本申请实施例提供一种Java源代码加密的方法,下面结合说明书附图对本申请的具体实施方式
进行详细说明:
因为现有的程序编译过程中,功能模块的细化使得编译人员,能够在自己编译的程序中使用调用模块的方法将多个功能模块串接在一起实现一个完整的功能。所以,每个Java程序都包括一个逻辑的框架以及逻辑框架中各接口调用的一些源代码。即每个程序源代码包括每个原函数的调用信息和抽取了函数调用逻辑的Java代码。
步骤101,对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;其中所述函数的调用信息包括:函数的调用对象,函数名、函数的参数列表和函数的返回值类型。
在本申请实施例中,可以通过多种方式对程序源代码进行逻辑抽出处理,最优的实现方式可以是:通过抽象语法树(AST Abstract Syntax Tree)对所述源代码进行逻辑抽出处理;或者通过字节码方式对所述源代码进行逻辑抽出处理。
其中,AST(Abstract Syntax Tree)作为程序的一种中间表示形式,在程序分析等诸多领域有广泛的应用。利用抽象语法树可以方便地实现多种源程序处理工具。比如源程序浏览器、智能编辑器、语言翻译器等.抽象语法树的结构不依赖于源语言的文法,也就是语法分析阶段所采用的上下文无关文法。因为在Parser工程中,经常会对文法进行等价的转换(消除左递归、回溯、二义性等),这样会给文法引入一些多余的成分,对后续阶段造成不利影响,甚至会使各阶段变得混乱。因此,很多编译器(包括GJC)经常要独立地构造语法分析树,为前、后端建立一个清晰的接口。
因为在逻辑抽取后,需要保持程序的完整性,使得程序运行时候能够找到抽取出来的函数。所有需要在源程序被抽取函数的位置添加一个第一函数,该第一函数即为被抽取函数的填充函数。
步骤102,将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件;
为了保证第一函数和原函数的一致性,所述第一函数的返回类型与对应位置的原函数的返回类型相同;另外,为了起到加密的混淆的作用,第一函数中各参数的位置与对应位置的原函数的参数位置不相同,但是第一函数中被打乱参数的位置信息与原函数的信息保存有对应的关系。
为了进一步的增加所述程序的安全性,还可以在所述第一函数中加入无效参数,所以所述第一函数中的参数与原函数相比还包括无效参数。
其中,第一个调用参数是函数的调用者,剩余参数与原原函数调用的参数列表相同。
根据实例对步骤101和步骤102做进一步详细的说明,例:
原有代码为:
SomeClass x = new SomeClass O ;
String s = x.get(100);
经过函数调用逻辑抽取后的代码:
SomeClass x = new SomeClass ();
String s = A.stub_1234(x, 100) ;/A 为随机函数 /
表述原函数与随机插入函数关系的代码:
public static String stubl234(SomeClass a,int b) { return a.get(b); }
步骤103,将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终 端。
其中,所述java类加载器与所述程序源代码的启动控制方式对应,所述启动控制方式包括:输入密码启动,注册码启动,绑定Mac地址或绑定U盾方式。
当用户终端需要运行所述程序源代码时,用户终端通过发送请求获取所述授权文件,并应用对应的所述Java类加载器ClassLoader解密所述授权文件,并将解密得到的函数调用逻辑与所述抽取了函数调用逻辑的JAVA代码生成源代码文件。
由于现有基于类加载器的Java加密程序的类加载本身就是使用Java实现的,可以被直接反编译导致被破解,为了增加整个加密过程的安全性,本申请实施例中的ClassLoader使用C语言实现。
因为所述ClassLoader是基于C语言实现的,所以使用JNI技术在Java中调用此C语言实现的解密类加载器对授权文件进行解密操作,即使用JNI技术,使用C语言编写的ClassLoader直接向JVM中装入类。
如图2所示,根据上述加密的方法,本申请实施例还提供一种Java源代码解密方法,该方法具体包括:
步骤201,当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求;
本申请实施例中,所述授权文件即图1方法步骤中提取的源代码中的每个原函数的调用信息,以及调运信息与第一函数的对应关系。
步骤202,接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的JAVA代码对应的解密所述授权文件的Java类加载器;
步骤203,当所述程序源代码启动时,应用所述类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将得到的多个函数调用信息与所述抽取了函数调用逻辑的JAVA代码组合得到完整的程序源代码。
由于现有基于类加载器ClassLoader的Java加密程序的类加载本身就是使用Java实现的,可以被直接反编译导致被破解,为了增加整个加密过程的安全性,本申请实施例中的ClassLoader使用C语言实现。
因为所述ClassLoader是基于C语言实现的,所以使用JNI技术在Java中调用此C语言实现的解密类加载器对所述授权文件进行解密操作,即使用JNI技术,使用C语言编写的ClassLoader直接向JVM中装入类。
从Javal.1 开始,JNI (Java Native Interface, JAVA 本地调用)标准成为 java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI —开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持即可。
所述java类加载器与所述程序源代码的启动控制方式对应,所述启动控制方式包括:输入密码启动,注册码启动,绑定Mac地址或绑定U盾等方式。通过编写用于不同平台的ClassLoader,可以实现在任意平台上运行加密后的程序。
如图3所示,根据图1所述的方法本申请实施例还提供一种Java源代码加密装置,该装置包括:
函数抽取模块301,用于对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;
包装函数生成模块302,用于将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件;
加密文件生成模块303,用于将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端通过发送请求获取所述授权文件后,应用所述Java类加载器解密所述授权文件,并将解密得到的函数的调用信息与所述抽取了函数调用逻辑的Java代码生成源代码文件。
如图4所示,根据图2所示的方法,本申请实施例还提供一种Java源代码解密装置,该装置包括:
授权文件获取模块401,用于当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求;
源代码生成模块402,用于接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器,当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
如图5所示,本申请实施例还提供一种Java程序运行控制系统,包括服务器501和用户终端502:
所述服务器501,用于对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件,将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端;
用户终端502,用于当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求;接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器,当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
本申请实施例中的上述一个或多个技术方案,至少具有如下的技术效果:
本申请所提供的方法和装置通过抽取Java代码中的函数调用逻辑进行集中加密,使得任何的反编译手段失效。因为本申请实中的类加载器是是与程序的启动方式对应的,所以可以在不需要开发人员参与的条件下,把多种多样的运行控制逻辑注入现有代码,使得本申请加密后的程序源代码具有很高的安全性和易用性。
本申请所述的方法并不限于具体实施方式
中所述的实施例,本领域技术人员根据本申请的技术方案得出其它的实施方式,同样属于本申请的技术创新范围。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。
权利要求
1.一种Java源代码加密的方法,其特征在于,该方法包括: 对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码; 将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件; 将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端通过发送请求获取所述授权文件后,应用所述Java类加载器解密所述授权文件,并将解密得到的函 数的调用信息与所述抽取了函数调用逻辑的Java代码生成源代码文件。
2.如权利要求1所述的方法,其特征在于,所述java类加载器与所述程序源代码的启动控制方式对应,所述启动控制方式包括:输入密码启动,注册码启动,绑定Mac地址或绑定U盾方式。
3.如权利要求1所述的方法,其特征在于,所述对程序源代码进行逻辑抽出处理的方式包括: 通过抽象语法树对所述源代码进行逻辑抽出处理;或者 通过字节码方式对所述源代码进行逻辑抽出处理。
4.如权利要求1所述的方法,其特征在于,所述第一函数的返回类型与对应位置的原函数的返回类型相同,第一函数中各参数的位置与对应位置的原函数的参数位置不相同。
5.如权利要求1所述的方法,其特征在于,所述第一函数中还包括无效参数。
6.如权利要求1所述的方法,其特征在于,所述类加载器ClassLoader使用C语言实现,则使用JNI在Java中调用C语言实现的类加载器对所述授权文件进行解密操作。
7.—种Java源代码解密方法,其特征在于,包括: 当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求; 接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器; 当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
8.—种Java源代码加密装置,其特征在于,该装置包括: 函数抽取模块,用于对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码; 包装函数生成模块,用于将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件; 加密文件生成模块,用于将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端通过发送请求获取所述授权文件后,应用所述Java类加载器解密所述授权文件,并将解密得到的函数的调用信息与所述抽取了函数调用逻辑的Java代码生成源代码文件。
9.一种Java源代码解密装置,其特征在于,该装置包括: 授权文件获取模块,用于当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求; 源代码生成模块,用于接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器,当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
10.一种Java程序运行控制系统,其特征在于,包括服务器和用户终端: 所述服务器,用于对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件,将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端; 用户终端,用于当需要运行任一程序源代码时,向服务器发送获取该程序源代码对应授权文件的请求;接收到所述授权文件后,获取所述程序源代码对应的抽取了函数调用逻辑的Java代码和对应的解密所述授权文件的Java类加载器,当所述程序源代码启动时,应用所述Java类加载器解密所述授权文件得到所述程序源代码中的多个函数调用信息,将所述函数调用信息与所 述抽取了函数调用逻辑的Java代码组合得到完整的程序源代码。
全文摘要
本申请公开了一种Java源代码加解密的方法及装置,应用于网络技术领域。该方法包括对程序源代码进行逻辑抽出处理,得到源代码中的每个原函数的调用信息和抽取了函数调用逻辑的Java代码;将随机命名的第一函数插入每个原函数在所述程序源代码中的调用位置,并对所述第一函数与所述原函数的调用信息的对应关系进行加密生成授权文件;将所述抽取了函数调用逻辑的Java代码和对应的Java类加载器发送到用户终端,使用户终端解密所述授权文件与所述抽取了函数调用逻辑的Java代码生成源代码文件。应用本申请提供的方法和装置能够方便的对现有代码进行有效的版权保护和运行控制。
文档编号G06F21/12GK103218549SQ20121001820
公开日2013年7月24日 申请日期2012年1月19日 优先权日2012年1月19日
发明者赵羽佳, 连博识 申请人:阿里巴巴集团控股有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1