一种Jar包加固方法及系统与流程

文档序号:12669721阅读:223来源:国知局
本发明属于计算机安全防护
技术领域
:,具体涉及一种Android项目中使用Native编程实现的一种Jar包的加固方法及系统。
背景技术
::由于Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译,从而观察程序的结构与实现细节。对于需要提供Jar(JavaArchive,即Java归档)包的第三方,为保护知识产权,需要对Jar包进行保护,增加非法用户获取到Jar包后对Java源码静态分析的难度。为Android项目中提供Jar包时,为了防止Jar包被逆向分析得到源代码,需要对Jar包文件进行加固处理。现在的加固方法有使用Proguard工具进行混淆、DEX(DalvikExecutable,即Dalvik可执行文件)保护、算法加密保护等。目前已有这方面的专利技术申请,例如申请号为201110288519.0的中国发明专利申请,公开了一种Java源代码的保护方法和系统。在第一启动类被调用时,该方法包括以下步骤,其中,第一启动类为Java程序的启动类:第一启动类将第一密文数据进行解密,得到类加载器;类加载器将第二密文数据读入内存进行解密,得到第一类,其中,第一类为Java虚拟机运行的类,其后缀名为.class;类加载器将第二启动类加载到内存,其中,第二启动类为Java程序的jar包中的原启动类;以及类加载器将第一类加载到Java虚拟机,以便Java虚拟机能够调用第二启动类中的主接口,运行Java程序。通过本发明,能够实现Java源代码的保护,使得Java源代码不易被反汇编。然而,上述技术中,针对Android平台都有一定的局限性:使用Proguard工具进行代码混淆,代码经过混淆后,改变了一部分类名、方法名和变量名,使得反编译后阅读代码难度增加。但混淆只是增加了逆向的时间成本,仍然面临被逆向成功的风险。另一方面,混淆功能有一定的限制,一些关键的类名、方法名和变量名因使用限制不能混淆。而加密算法加密Jar包文件后,在App调用Jar时需要使用密钥解密后再进行加载调用。这种方法的安全性取决于密钥的安全性,如果密钥以字符串的形式保存在源代码中,被逆向的风险较大。另一方面,在Android中使用Java语言编写,Java逆向难度较C/C++小,加密密钥不论是保存在源代码中还是通过算法计算得到,都会有被逆向获取的风险。技术实现要素:为解决上述问题,本发明提出了一种使用对称加密算法对Jar包加密的方法和系统,包括密钥提取、Jar包加密、Native动态库解密以及解密完成后清除文件,提高了Jar包逆向的难度,保护Android中Jar包文件,增强其安全性,降低了Jar包源代码被逆向获取的风险。具体的,根据本发明的一个方面,提供了一种Jar包加固方法,所述方法包括如下步骤:加密Jar包文件并向Android项目提供加密后的Jar包以及解密动态库;Android项目使用解密动态库解密Jar包文件;Android项目调用解密后的Jar包文件;Android项目删除解密后的Jar包文件和从该Jar包文件中释放出的DEX文件。进一步,如上所述的Jar包加固方法,所述Jar包加密分为以下三个步骤:(1)、复制原始Jar包文件的前N字节,作为新Jar包文件的头部;(2)、使用密钥提取算法从N字节的Jar包文件头部里提取对称加密算法的密钥;(3)、对原始Jar包文件的除前N字节之外的部分使用所述对称加密算法和所述密钥进行加密,然后把加密后的部分与新Jar包文件的头部组合为新Jar包文件。进一步,如上所述的Jar包加固方法,所述密钥提取算法为如下三种中的一种或多种组合:第一种,从N字节的Jar包文件头部里随机选择若干字节作为密钥或密钥的一部分;第二种,先从N字节的Jar包文件头部里随机选择若干字节,然后将这些字节进行逻辑与、逻辑或、和/或哈希计算,选择处理后的若干字节作为密钥或密钥的一部分;第三种,先计算N字节的Jar包文件头部的哈希值,然后选择所述哈希值的若干字节作为密钥或密钥的一部分。进一步,如上所述的Jar包加固方法,所述使用解密动态库解密Jar包文件分为以下三个步骤:(1)、复制新Jar包文件的头部N字节作为解密后Jar包文件的头部;(2)、使用密钥提取算法从新Jar包文件的头部提取解密密钥;(3)、使用对称加密算法和解密密钥把新Jar包文件除前N字节之外的部分解密,与头部组合为解密后Jar包文件。更进一步,如上所述的Jar包加固方法,所述对称加密算法为以下算法中的一种:DES、3DES、AES、SM4、Blowfish、IDEA、RC4、RC5、RC6。根据本发明的另一个方面,本发明还提供了一种Jar包加固系统,所述系统包括如下模块:Jar包加密模块,用于加密Jar包文件;Jar包解密模块,用于使用解密动态库解密Jar包文件;Jar包调用模块,用于调用解密后的Jar包文件;文件删除模块,用于删除解密后的Jar包文件和从该Jar包文件中释放出的DEX文件。进一步,如上所述的Jar包加固系统,所述Jar包加密模块具有如下三个单元:第一复制单元,用于复制原始Jar包文件的前N字节,作为新Jar包文件的头部;加密密钥提取单元,用于使用密钥提取算法从N字节的Jar包文件头部里提取对称加密算法的密钥;加密及组合单元,用于对原始Jar包文件的除前N字节之外的部分使用所述对称加密算法和所述密钥进行加密,然后把加密后的部分与新Jar包文件的头部组合为新Jar包文件。进一步,如上所述的Jar包加固系统,所述密钥提取算法为如下三种中的一种或多种组合:第一种,从N字节的Jar包文件头部里随机选择若干字节作为密钥或密钥的一部分;第二种,先从N字节的Jar包文件头部里随机选择若干字节,然后将这些字节进行逻辑与、逻辑或、和/或哈希计算,选择处理后的若干字节作为密钥或密钥的一部分;第三种,先计算N字节的Jar包文件头部的哈希值,然后选择所述哈希值的若干字节作为密钥或密钥的一部分。进一步,如上所述的Jar包加固系统,所述Jar包解密模块具有如下三个单元:第二复制单元,用于复制新Jar包文件的头部N字节作为解密后Jar包文件的头部;解密密钥提取单元,用于使用密钥提取算法从新Jar包文件的头部提取解密密钥;解密及组合单元,用于使用对称加密算法和解密密钥把新Jar包文件除前N字节之外的部分解密,与头部组合为解密后Jar包文件。进一步,如上所述的Jar包加固系统,所述对称加密算法为以下算法中的一种:DES、3DES、AES、SM4、Blowfish、IDEA、RC4、RC5、RC6。本发明的有益效果如下:本发明中,通过把Jar包加密,在Android项目中使用Native动态库的方法解密Jar包,密钥提取方法和解密方法由Native动态库实现,这样把Jar包的安全风险转移到了Native动态库的安全上。因为Native动态库使用C/C++语言编写,逆向的难度强于Java语言,另一方面,当前对Native动态库的加固方案比较成熟,更能提高Native动态库的安全性,从而提高Jar包的安全性。本发明中,使用了对称加密算法对Jar包加解密,解密效率比非对称加密算法要高。本发明中,Jar包加密前后头部N字节保持一致,而不是对整个Jar包文件加密,给逆向分析增加了迷惑性。本发明中,加解密密钥从Jar包中提取得到,减小了把密钥存储在代码中被非法用户逆向读取的风险。本发明中,Android项目调用完成解密后的Jar包后,删除该Jar包文件以及从中释放出的DEX文件,降低解密后的Jar和DEX文件被获取的几率。上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。附图说明图1为本发明的一种Jar包加固方法流程图;图2为本发明的Jar包加密流程图;图3为本发明的Jar包加密原理示意图;图4为本发明的解密Jar包的流程图;图5为本发明的Jar包解密原理示意图;图6为本发明的使用Jar包的流程图;图7为本发明的一种Jar包加固系统的模块图;图8为本发明的Jar包加密模块的结构图;图9为本发明的Jar包解密模块的结构图;图10为本发明的另一个优选实施例中的Jar包加密原理示意图。具体实施方式下面结合附图和具体实施方式对本发明作进一步描述。实施例1本实施例中,在Jar包文件提供给Android项目使用之前,需要先对其进行加密。把加密后的Jar包文件和用于解密的动态库提供给Android项目使用。具体的,如图1所示,为本发明的一种Jar包加固方法流程图,所述方法包括如下步骤:S110、加密Jar包文件并向Android项目提供加密后的Jar包以及解密动态库。如图2所示,Jar包加密分为以下三个步骤:S111、复制原始Jar包文件(以下称为raw.jar)前N字节,作为新Jar包文件(以下称为new.jar)的头部。S112、使用密钥提取算法(以下称为f)从N字节的Jar包文件头部里提取对称加密算法(以下称为F,用于接下来加密Jar包尾部,可以是DES、3DES、AES、SM4、Blowfish、IDEA、RC4、RC5、RC6等对称加密算法)的密钥key。所述密钥提取算法包括如下三种组合:第一种,从N字节的Jar包文件头部里随机选择若干字节作为密钥或密钥的一部分;第二种,先从N字节的Jar包文件头部里随机选择若干字节,然后将这些字节进行逻辑与、逻辑或、和/或哈希计算,,选择处理后的若干字节作为密钥或密钥的一部分;第三种,先计算N字节的Jar包文件头部的哈希值,然后选择所述哈希值的若干字节作为密钥或密钥的一部分。因为Jar包文件本质上是zip文件,其头部有固定的字符,为了保证提取的密钥的安全性,N的选择不能过小,同时在设计密钥提取算法时尽量避开头部若干字节。S113、对raw.jar的尾部(除前N字节之外的部分)使用F进行加密,加密密钥为key。把加密后的部分与new.jar的头部组合为new.jar。为Android项目提供加密后的new.jar文件。图3为与上述加密流程对应的本发明的Jar包加密原理示意图。S120、Android项目使用解密动态库解密Jar包文件。首先使用基于Native的C/C++语言编写解密动态库(称为lib.so)。lib.so中的解密方法用于把new.jar解密为原始的raw.jar。如图4所示,lib.so的解密步骤为:S121、复制new.jar头部N字节作为raw'.jar头部;S122、使用密钥提取算法f从new.jar头部提取解密密钥key;S123、使用对称加密算法F把new.jar尾部解密,与头部组合为raw'.jar,raw'.jar即为原始Jar包文件。图5为与上述解密流程对应的本发明的Jar包解密原理示意图。S130、Android项目调用解密后的Jar包文件。S140、Android项目删除解密后的Jar包文件和从该Jar包文件中释放出的DEX文件。在Android项目中需要使用到Jar包时,需要向其提供new.jar和lib.so两个文件,如图6所示,使用Jar包的过程为:S151、Android项目加载lib.so;S152、调用lib.so的解密方法把new.jar还原为raw'.jar;S153、Android项目调用解密后的raw'.jar;S154、Android项目使用完raw'.jar之后,删除raw'.jar和从中释放出的DEX文件。根据本发明的另一个方面,如图7所示,为本发明的一种Jar包加固系统200的模块图,所述系统200包括如下模块:Jar包加密模块210,用于加密Jar包文件;Jar包解密模块220,用于使用解密动态库解密Jar包文件;Jar包调用模块230,用于调用解密后的Jar包文件;文件删除模块240,用于删除解密后的Jar包文件和从该Jar包文件中释放出的DEX文件。如图8所示,所述Jar包加密模块210具有如下三个单元:第一复制单元211,用于复制原始Jar包文件的前N字节,作为新Jar包文件的头部;加密密钥提取单元212,用于使用密钥提取算法从N字节的Jar包文件头部里提取对称加密算法的密钥;加密及组合单元213,用于对原始Jar包文件的除前N字节之外的部分使用所述对称加密算法和所述密钥进行加密,然后把加密后的部分与新Jar包文件的头部组合为新Jar包文件。所述密钥提取算法为如下两种中的一种:第一种,从N字节的Jar包文件头部里随机选择若干字节作为密钥或密钥的一部分;第二种,先从N字节的Jar包文件头部里随机选择若干字节,然后将这些字节进行逻辑与、逻辑或、和/或哈希计算,选择处理后的若干字节作为密钥或密钥的一部分;第三种,先计算N字节的Jar包文件头部的哈希值,然后选择所述哈希值的若干字节作为密钥或密钥的一部分。如图9所示,所述Jar包解密模块220具有如下三个单元:第二复制单元221,用于复制新Jar包文件的头部N字节作为解密后Jar包文件的头部;解密密钥提取单元222,用于使用密钥提取算法从新Jar包文件的头部提取解密密钥;解密及组合单元223,用于使用对称加密算法把新Jar包文件除前N字节之外的部分解密,与头部组合为解密后Jar包文件。该领域的技术人员应该知道,本发明以上实施例中提到的对称加密算法应包括DES(DataEncryptionStandard,即数据加密标准)、3DES、AES(AdvancedEncryptionStandard,即高级加密标准)、SM4、Blowfish、IDEA、RC4、RC5、RC6等。本发明以上的实施例中保持了Jar包头部不变,对Jar包尾部进行加密,然而在本发明的另一个优选实施例中,如图10所示,也可以保持Jar包中间一部分或尾部不变,加密其他部分,加密密钥从保持不变的部分提取。本领域技术人员应该明白,本发明所述的方法和系统并不限于具体实施方式中所述的实施例,上面的具体描述只是为了解释本发明的目的,并非用于限制本发明。本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围,本发明的保护范围由权利要求及其等同物限定。当前第1页1 2 3 当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1