一种保护类文件的方法和装置的制作方法

文档序号:6331909阅读:122来源:国知局
专利名称:一种保护类文件的方法和装置的制作方法
技术领域
本发明涉及类文件的安全保护技术,特别涉及一种保护类文件的方法和装置。
背景技术
Java语言能够跨平台,是因为Java源代码被编译器翻译成了类文件,而类文件作 为中间代码是以一种和平台无关的格式保存的。类文件有一个缺点,就是可以利用JDK中 的反汇编器javap对类文件进行反汇编,然后再利用反编译工具对反汇编的结果进行反编 译,得出该类的源代码。这对需要防止Java源代码被剽窃或攻击的程序员来说是非常不利 的。现有类文件保护的方法主要有如下几种字节码混淆技术、本地编译技术、字节码 水印技术和JVM类加载器加密技术。字节码混淆技术是利用混淆器工具防范反编译器的编译,其目的是使反编译程序 难以理解类程序,以至于逆向工程将花费更多的时间和精力来翻译类文件,大部分混淆器 工具打乱在字节码文件中的标识符,一个有意义的名字用顺序或随机产生的毫无意义的名 字代替。但这种技术只是做到了表面上的模糊,其内部业务逻辑却依然不变,如果破解者有 耐心,仍是可以攻破的。本地编译技术是指将Java应用程序编译成本地应用程序,将文字码程序转换成 本地二进制文件,不仅可提高程序运行速度、占用更少的内存,还可使其安全性达到本地可 执行应用程序的程度。但这种技术使应用程序失去了跨平台的特征,并且由于本地编译器 的不成熟,不适应于大型应用程序。字节码水印技术与在图片声音中嵌入水印一样,在Java程序中也能嵌入透明的、 安全的和鲁棒性的信息,能够在确认某些程序是否属于剽窃时提供有效的证据,但不能阻 止类文件被重用或者被反编译。Java虚拟机JVM类加载器加密技术首先采用一定的加密算法加密类文件,再将此 类文件传输到目的主机,然后用特定的自定义类加载器加载并解析加密的类文件。这种技 术既保持了 Java程序的跨平台性,又增加了类文件的安全性,但对用户来说使用不方便。

发明内容
本发明的目的在于提供一种保护类文件的方法和装置,用于解决阻止类文件被反 编译,保持跨平台特性以及用户使用的便捷性问题。根据本发明的一个方面,提供了一种保护类文件的方法,包括以下步骤A、加密单元读取所需加密的类文件字节码,并利用密钥对加密类文件字节码,得 到加密字节码文件;B、编译单元将用于验证用户的验证码和密钥对填充到本地应用程序中,经过编译 本地应用程序的源代码得到文件保护装置;C、文件保护装置利用密钥对解密加密字节码文件。
根据本发明的另一方面,提供了一种保护类文件的装置,包括加密单元,用于读取所需加密的类文件字节码,并利用密钥对加密类文件字节码, 得到加密字节码文件;编译单元,将用于验证用户的验证码和密钥对填充到本地应用程序中,经过编译 本地应用程序的源代码得到文件保护装置;以及文件保护装置,利用密钥对解密加密字节码文件。与现有技术相比较,本发明的有益效果在于本发明采用文件加密装置加密类文 件中的字节码,并采用在加密过程中生成的文件保护装置解密字节码,有效地阻止了类文 件被反编译,同时保持了程序的跨平台特性,并且用户使用起来也比较方便。


图1是本发明提供的保护类文件的方法流程图;图2是本发明提供的保护类文件的装置结构图;图3是本发明实施例提供的基于文件加密装置加密类文件的流程示意图;图4是本发明实施例提供的基于文件保护装置解密类文件的流程示意图。
具体实施例方式以下结合附图对本发明的优选实施例进行详细说明,应当理解,以下所说明的优 选实施例仅用于说明和解释本发明,并不用于限定本发明。图1显示了本发明提供的保护类文件的方法流程,如图1所示步骤S101,加密单元读取所需加密的类文件字节码,并利用密钥对中的公钥加密 类文件字节码,得到加密字节码文件。在此之前,需对导入的类文件进行文件类型的判断,若是不可支持的文件类型则 结束加密操作,若是可支持的文件类型则密钥产生单元通过内置的算法得到密钥对,该密 钥对包括用于加密的公钥和用于解密的私钥。其中,内置的算法不唯一,但应能够加密类文 件,并且可以实现双向加密。类文件以字节码的形式保存,加密单元读取该类文件的字节码,再利用预先生成 的公钥加密该字节码。步骤S102,编译单元将用于验证用户的验证码和私钥填充到本地应用程序中,经 过编译本地应用程序的源代码得到文件保护装置。验证信息获取单元获取用户环境信息之后,再利用预先设定的算法将其转化得到 用于验证用户的验证码,其中,用户环境信息是主机的硬件信息,该信息应满足唯一性的特 点ο编译完成得到文件保护装置后,删除读取的原类文件。步骤S103,文件保护装置利用私钥对加密字节码文件进行解密。在解密之前由JVM启动初始化的操作,运行文件保护装置中的回调函数,回调函 数获取用户环境信息并判断与验证码是否匹配,若不匹配则结束解密操作,若匹配则对所 需解密的类文件进行动态加载。其具体过程为由回调函数将自定义的本地代理注册至已 定义的方法上,当调用相应的Java方法时,则进行拦截并调用本地代理以加载相应的类文件。图2是本发明提供的保护类文件的装置结构,如图2所示,该装置包括密钥产生单 元、加密单元、验证信息获取单元、编译单元、文件删除单元、文件加载单元和文件保护装置 构成。密钥产生单元对导入的类文件采用内置算法得到密钥对,其中密钥对包括用于加 密的公钥和用于解密的私钥。加密单元利用公钥加密读取的类文件的字节码,得到加密字节码文件。验证信息获取单元获取用户环境信息,再利用预先设定的算法转化得到用于验证 用户的验证码。编译单元将用于验证用户的验证码和私钥填充到本地应用程序中,经过编译本地 应用程序的源代码得到文件保护装置。文件删除单元在加密完成后删除文件读取单元读取的类文件。在需要解密时,文件加载单元在解密前为用户环境信息与验证码匹配的用户将加 密字节码文件加载至文件保护装置。文件保护装置,利用私钥对加密字节码文件进行解密。其中,密钥产生单元、加密单元、验证信息获取单元、编译单元和文件删除单元共 同构成文件加密装置,文件加密装置是一种能够加密类文件,并且可以进行双向加密的软 件工具。图3显示了本发明实施例提供的基于文件加密装置加密类文件的流程示意,如图 3所示步骤S301,将Java应用程序中需要加密的类文件导入到文件加密装置中。步骤S302,文件加密装置读取导入的类文件信息。步骤S303,文件加密装置判断导入的类文件是否是可支持的文件类型,若不是可 支持的文件类型则结束操作,若是可支持的文件类型则执行步骤S304。步骤S304,文件加密装置通过内置的算法得到加密公钥和私钥。步骤S305,文件加密装置读取类文件的字节码。步骤S306,文件加密装置利用公钥加密类文件的字节码,得到加密字节码文件。步骤S307,文件加密装置获取用户环境信息,利用预先设定的算法转化得到验证 码。步骤S308,文件加密装置将验证码和私钥填充到本地应用程序中,编译本地程序 的源代码得到文件保护装置。步骤S309,文件加密装置删除读取的类文件。步骤S310,返回加密字节码文件和文件保护装置。步骤S311,文件加密装置获取JDK版本信息,替换JDK核心rt. jar。rt. jar中的ClassLoader的def ineClass方法的具体实现被修改,使其在系统调 用defineClassl本地方法之前将它拦截,使系统先利用自定义本地本地方法解密字节码, 然后用解密后的字节码生成Class对象再传递给系统,这样将解密的工作放在本地代码中 实现,从而使加密方法达到在本地应用程序安全级别,同时也不用修改JVM源代码。图4显示了本发明实施例提供的基于文件保护装置解密类文件的流程示意,如图4所示步骤S401,Java应用程序运行之前在启动参数中增加-agentlib ,后面接文件 保护装置的名称,不包括.lib或.so后缀。步骤S402,运行Java应用程序,JVM进入初始化阶段,触发运行文件保护装置中 JVM初始化事件的回调函数。步骤S403,回调函数获取用户环境信息。步骤S404,在回调函数中判断该用户是否是文件保护装置的授权用户,也就是说, 判断该用户的环境信息与验证码是否匹配,若不是授权用户即不匹配则文件保护装置执行 步骤S414结束操作,若是授权用户即匹配则执行步骤S405。步骤S405,回调函数引用JNI技术的RegisterNatives函数将自定义的本地代理 注册到defineClassl方法上,这样当系统调用相应的Java方法时,进行拦截调用本地代 理,而不是直接调用原来动态连接库中的defineClassl本地方法。步骤S406,Java应用程序执行相应功能,当需要调用加密字节码文件中的方法时 ClassLoader对加密字节码文件进行动态加载。步骤S407,加载加密字节码文件过程中,调用文件保护装置中注册的本地代理;步骤S408,调用本地代理时将加密字节码文件自动传递给代理函数;步骤S409,在代理函数中利用私钥进行字节数组解密;步骤S410,在解密后调用动态连接库中的defineClassl方法来生成Class对 象。其中,若为Windows平台,则调用为jvm. dll的动态链接库中的jaVa_jaVa_lang_ ClassLoader_defineClassli32 方法,若为 Linux 或 Unix 平台,则调用为 libjava. so 的动 Hilii_pI11 白勺 java_java_lang_ClassLoader_def ineClassl 卞法。步骤S411,在defineClassl方法中判断是否成功生成Class对象,若没有成功生 成Class对象则结束操作,若成功生成Class对象则继续执行步骤S412。步骤S412,返回Class对象传递给JVM,执行相应的功能。Java中要实现本地方法的拦截可以采用JNI和JVMTI技术,当JVM加载一个代 理时,JVM会调用AgentJtaLoad函数,若在这个函数中注册了 VMInit事件,那么在虚拟机 初始化后将会运行VMInit事件的回调函数,并在这个回调函数中获得JNI环境。为了使 系统调用defineClassl函数,在回调函数中利用JNI技术中的RegisterNatives方法将 ClassLoader类中的defineClassl方法注册为自己定义的一个代理函数,这样系统在为了 生成某个类的Class对象而运行defineClassl方法时将会调用这个代理函数,这个代理函 数是一个本地函数,它主要实现对字节码的解密,并在解密后调用jvm. dll或libjava. so 的动态连接库中的函数来生成Class对象。通过这种方式,可以将解密过程放在本地代码 中实现。综上所述,本发明具有以下技术效果本发明克服了现有保护类文件的缺陷和障 碍,更好地防止Java源代码被剽窃或攻击,既可以保持类文件的跨平台特征,使保护类文 件的安全性达到本地应用程序级别,又不用修改JVM源代码重新生成Java, exe。尽管上文对本发明进行了详细说明,但是本发明不限于此,本领域技术人员可以 根据本发明的原理进行各种修改。因此,凡按照本发明原理所作的修改,都应当理解为落入 本发明的保护范围。
权利要求
一种保护类文件的方法,其特征在于,包括以下步骤A、加密单元读取所需加密的类文件字节码,并利用密钥对加密所述类文件字节码,得到加密字节码文件;B、编译单元将用于验证用户的验证码和密钥对填充到本地应用程序中,经过编译所述本地应用程序的源代码得到文件保护装置;以及C、所述文件保护装置利用密钥对解密所述加密字节码文件。
2.根据权利要求1所述的一种保护类文件的方法,其特征在于,在所述步骤A之前,还 包括以下步骤密钥产生单元产生密钥对。
3.根据权利要求2所述的一种保护类文件的方法,其特征在于,所述密钥对包括公钥,用于加密所述类文件字节码;以及私钥,用于解密所述加密字节码文件。
4.根据权利要求3所述的一种保护类文件的方法,其特征在于,所述验证码的获取包 括以下步骤验证信息获取单元获取用户环境信息,再利用预先设定的算法转化得到验证 码。
5.根据权利要求4所述的一种保护类文件的方法,其特征在于,在所述步骤C之后,删 除文件读取单元读取的类文件。
6.根据权利要求5所述的一种保护类文件的方法,其特征在于,在所述步骤D之前,文 件加载单元判断用户环境信息与验证码是否匹配,并为匹配的用户将所述加密字节码文件 加载至文件保护装置。
7.一种保护类文件的装置,其特征在于,包括加密单元,用于读取所需加密的类文件字节码,并利用密钥对加密所述类文件字节码, 得到加密字节码文件;编译单元,将用于验证用户的验证码和密钥对填充到本地应用程序中,经过编译所述 本地应用程序的源代码得到文件保护装置;以及文件保护装置,利用密钥对解密所述加密字节码文件。
8.根据权利要求7所述的一种保护类文件的装置,其特征在于,所述装置还包括密钥产生单元,用于产生密钥对;以及文件删除单元,用于在加密完成后删除文件读取单元读取的类文件。
9.根据权利要求8所述的一种保护类文件的装置,其特征在于,所述装置还包括验证 信息获取单元,用于获取用户环境信息,再利用预先设定的算法转化得到验证码。
10.根据权利要求9所述的一种保护类文件的装置,其特征在于,所述装置还包括文 件加载单元,在解密前判断用户环境信息与验证码是否匹配,并对匹配的用户将所述加密 字节码文件加载至文件保护装置。
全文摘要
本发明公开了一种保护类文件的方法和装置,该方法包括加密单元读取所需加密的类文件字节码,并利用密钥对加密类文件字节码,得到加密字节码文件;编译单元将用于验证用户的验证码和密钥对填充到本地应用程序中,经过编译本地应用程序的源代码得到文件保护装置;文件保护装置利用密钥对解密加密字节码文件。本发明采用文件加密装置加密类文件中的字节码,并采用在加密过程中生成的文件保护装置解密字节码,有效地阻止了类文件被反编译,同时保持了程序的跨平台特性,并且用户使用起来也比较方便。
文档编号G06F21/22GK101957903SQ20101027949
公开日2011年1月26日 申请日期2010年9月13日 优先权日2010年9月13日
发明者郭宏泰 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1