本发明属于计算机安全防护技术领域,具体涉及一种基于国密算法的Jar包加固方法及系统。
背景技术:
由于Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在运行期动态链接。这样,编译后的类文件中将包含有符号表,从而使得Java程序很容易被反编译,从而观察程序的结构与实现细节。对于需要提供Jar包的第三方,为保护知识产权,需要对Jar包进行保护,增加非法用户获取到Jar包后对Java源码静态分析的难度。
目前已有这方面的专利技术申请,例如申请号为201110288519.0的中国发明专利申请,公开了一种Java源代码的保护方法和系统。在第一启动类被调用时,该方法包括以下步骤,其中,第一启动类为Java程序的启动类:第一启动类将第一密文数据进行解密,得到类加载器;类加载器将第二密文数据读入内存进行解密,得到第一类,其中,第一类为Java虚拟机运行的类,其后缀名为.class;类加载器将第二启动类加载到内存,其中,第二启动类为Java程序的jar包中的原启动类;以及类加载器将第一类加载到Java虚拟机,以便Java虚拟机能够调用第二启动类中的主接口,运行Java程序。通过本发明,能够实现Java源代码的保护,使得Java源代码不易被反汇编。
然而,上述技术中,没有对Jar包的完整性校验,Jar包仍然可能被非法替换。另外,缺少对Jar包的加密过程,安全性不足。
技术实现要素:
为解决上述问题,本发明针对需要提供给第三方的Jar包,使用加密工具对其进行加密,同时提供给第三方Native版本的解密库。这样,非法用户获取到解密库后,无法静态分析出解密算法;获取到Jar包后,也无法解密出明文的Jar包。同时,在解密算法中增加了Jar包的完整性校验,可防止Jar包被非法替换。实际调用时,第三方工具先调用解密库解密Jar包,解密成功后将Jar包加载到内存中,同时删除本地相关解密文件。
具体的,根据本发明的一个方面,提供了一种Jar包加固方法,所述方法包括如下步骤:
使用国密算法加密需要提供给第三方的Jar包,同时提供解密库给第三方;
存放Jar包的加密密钥;
提取上述加密密钥;
调用上述解密库解密所述Jar包,解密成功后将Jar包加载到内存中,同时删除本地相关解密文件。
进一步,如上所述的Jar包加固方法,所述Jar包的加密分为以下五个步骤:
(1)、计算Jar包的SM3摘要值,记为SM3;
(2)、取16字节随机数RND16;
(3)、将SM3的前16字节与后16字节异或,记为Key1;
(4)、将Key1作为加密密钥对RND16进行SM4加密,结果记为Key2;
(5)、Key2作为Jar包加密密钥,对Jar包进行SM4加密。
进一步,如上所述的Jar包加固方法,所述存放Jar包的加密密钥的方法如下:对Jar包进行SM4加密的结果分为49块,其中前48块用来随机存放加密密钥;加密密钥第1字节存放在第48块,存放位置由第49块的数据确定,加密密钥第2字节存放在第47块,存放位置由第48块数据加第1字节密钥值确定,依次类推。
进一步,如上所述的Jar包加固方法,所述提取加密密钥的过程如下:
(1)、计算49块数据的大小;
(2)、获取第49块数据和第48块数据,获取第1字节密钥在第48块中的存储位置,从而获取第1字节的密钥值并还原第48块数据;
(3)、获取第2字节密钥在第47块中的存储位置,从而获取第2字节的密钥值并还原第47块数据;
(4)、以此类推,获取48字节的密钥及原始的49块数据。
进一步,如上所述的Jar包加固方法,上述解密Jar包的过程如下:
(1)、将48字节密钥值的前16字节与中间16字节异或,还原出Key1,使用Key1对后16字节密钥进行SM4解密,还原出Key2;
(2)、使用Key2对原始的49块数据进行SM4解密,还原出明文Jar包;
(3)、对明文Jar包计算SM3摘要值,与加密密钥前32字节进行比较,验证Jar包的完整性。
根据本发明的另一个方面,本发明还提供了一种Jar包加固系统,所述系统包括如下模块:
Jar包加密模块,通过使用国密算法加密需要提供给第三方的Jar包,同时提供解密库给第三方;
密钥存放模块,用于存放Jar包的加密密钥;
密钥提取模块,用于提取上述加密密钥;
Jar包解密模块,通过调用上述解密库解密所述Jar包,解密成功后将Jar包加载到内存中,同时删除本地相关解密文件。
进一步,如上所述的Jar包加固系统,所述Jar包加密模块具有如下五个单元:
SM3摘要值计算单元,用于计算Jar包的SM3摘要值,记为SM3;
随机数生成单元,用于取得16字节随机数RND16;
异或单元,用于将SM3的前16字节与后16字节异或,记为Key1;
随机数加密单元,用于将Key1作为加密密钥对RND16进行SM4加密,结果记为Key2;
SM4加密单元,用于将Key2作为Jar包加密密钥,对Jar包进行SM4加密。
进一步,如上所述的Jar包加固系统,所述密钥存放模块存放Jar包的加密密钥的方法如下:对Jar包进行SM4加密的结果分为49块,其中前48块用来随机存放加密密钥;加密密钥第1字节存放在第48块,存放位置由第49块的数据确定,加密密钥第2字节存放在第47块,存放位置由第48块数据加第1字节密钥值确定,依次类推。
进一步,如上所述的Jar包加固系统,所述密钥提取模块具有如下四个单元:
数据大小计算单元,用于计算49块数据的大小;
第一数据还原单元,用于获取第49块数据和第48块数据,获取第1字节密钥在第48块中的存储位置,从而获取第1字节的密钥值并还原第48块数据;
第二数据还原单元,用于获取第2字节密钥在第47块中的存储位置,从而获取第2字节的密钥值并还原第47块数据;
原始数据获取单元,用于获取48字节的密钥及原始的49块数据。
进一步,如上所述的Jar包加固系统,所述Jar包解密模块具有如下三个单元:
异或及解密单元,用于将48字节密钥值的前16字节与中间16字节异或,还原出Key1,使用Key1对后16字节密钥进行SM4解密,还原出Key2;
原始数据解密单元,通过使用Key2对Block1-49进行SM4解密,即可还原出明文Jar包;
完整性校验单元,用于对明文Jar包计算SM3摘要值,与加密密钥前32字节进行比较,验证Jar包的完整性。
本发明的有益效果如下:本发明可以很好的保证提供给第三方的Jar包的保密性和完整性,防止被恶意破解或替换,增加了非法用户获取到Jar包后对Java源码静态分析的难度。本发明可以应用于Android、Windows、Linux和Mac等平台,应用范围广。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
图1为本发明的一种基于国密算法的Jar包加固方法流程图;
图2为本发明的明文Jar包加密流程图;
图3为本发明的提取加密密钥的流程图;
图4为本发明的解密Jar包的流程图;
图5为本发明的一种基于国密算法的Jar包加固系统的模块图;
图6为本发明的Jar包加密模块的结构图;
图7为本发明的加密密钥模块的结构图;
图8为本发明的Jar包解密模块的结构图。
具体实施方式
下面结合附图和具体实施方式对本发明作进一步描述。
本实施例中,Jar包加解密采用了国产的SM2和SM3算法。具体的,根据本发明的一个方面,如图1所示,为本发明的一种基于国密算法的Jar包加固方法流程图,所述方法包括如下步骤:
S110、使用国密算法加密需要提供给第三方的Jar包,同时提供解密库给第三方;所述解密库为Native版本的解密库,其中在Windows平台中为dll库,在Android平台中为so库。
如图2所示,明文Jar包加密分为以下五个步骤:
S111、计算明文Jar包的SM3摘要值,记为SM3(OriginalJar),共32字节,该摘要值还会用于加载Jar包时的完整性校验。
S112、取16字节随机数RND16。
S113、将SM3(OriginalJar)的前16字节与后16字节异或,记为Key1。
S114、将Key1作为加密密钥对RND16进行SM4加密,即SM4-Enc(Key1,RND16),结果记为Key2。
S115、将Key2作为明文Jar包加密密钥,对Jar包进行SM4加密,结果为SM4-Enc(Key2,OriginalJar)。
S120、存放Jar包的加密密钥。
加密密钥包括32字节Hash值SM3(OriginalJar)和16字节随机数RND16,共48字节。密钥存放的方法如下:
将SM4-Enc(Key2,OriginalJar)分为49块,其中前48块用来随机存放加密密钥。加密密钥第1字节存放在第48块,存放位置由第49块的数据确定,加密密钥第2字节存放在第47块,存放位置由第48块数据加第1字节密钥值确定,依次类推。
其中,前48块每块大小为:Sizeof(Block1-48)=Sizeof(SM4-Enc(Key2,OriginalJar))/48,第49块大小为Sizeof(Block49)=Sizeof(SM4-Enc(Key2,OriginalJar))%48,Sizeof(Block49)可能为0。
进一步的,本发明中确定密钥存放位置的算法为:
首先计算第49块数据的HASH值,记为SM3(Block49),然后将SM3(Block49)按字节相加,结果记为∑(SM3(Block49)),第1字节在第48块中的存放位置为∑(SM3(Block49))%Sizeof(Block1-48)+1,存放后构成新的第48块数据,记为Block48′。
然后计算Block48′的HASH值,记为SM3(Block48′),然后将SM3(Block48′)按字节相加,结果记为∑(SM3(Block48′)),第2字节在第47块中的存放位置为∑(SM3(Block48′))%Sizeof(Block1-48)+1,存放后构成新的第47块数据,记为Block47′。
依次类推,将加密密钥随机存放在密文Jar包的前48块,构成新的Block1-48′,由Block1-48′加上Block49构成最终的密文JAR包,即EncryptedJar。
S130、提取上述加密密钥。如图3所示,提取加密密钥的过程如下:
S131、先计算49块数据的大小,其中Sizeof(Block1-48)=Sizeof(EncryptedJar)/48-1,Sizeof(Block49)=Sizeof(EncryptedJar)%48。
S132、获取第49块数据Block49和第48块数据Block48′,根据∑(SM3(Block49))%Sizeof(Block1-48)+1获取第1字节密钥在第48块中的存储位置,从而获取第一个字节的密钥值并还原第48块数据Block48。
S133、根据∑(SM3(Block48′))%Sizeof(Block1-48)+1获取第2字节密钥在第47块中的存储位置,从而获取第二个字节的密钥值并还原第47块数据Block47。
S134、以此类推,可以成功获取48字节的密钥及原始的49块数据Block1-49。
S140、调用上述解密库解密所述Jar包,解密成功后将Jar包加载到内存中,同时删除本地相关解密文件。
如图4所示,上述解密Jar包的流程如下:
S141、将48字节密钥值的前16字节与中间16字节异或,还原出Key1,使用Key1对后16字节密钥进行SM4解密,还原出Key2。
S142、使用Key2对Block1-49进行SM4解密,即可还原出明文Jar包。
S143、对明文Jar包计算SM3摘要值,与加密密钥前32字节进行比较,验证Jar包的完整性。
根据本发明的另一个方面,如图5所示,为本发明的一种基于国密算法的Jar包加固系统200的模块图,所述系统包括如下模块:
Jar包加密模块210,通过使用国密算法加密需要提供给第三方的Jar包,同时提供解密库给第三方;所述解密库为Native版本的解密库,其中在Windows平台中为dll库,在Android平台中为so库。
如图6所示,Jar包加密模块210分为以下五个单元:
SM3摘要值计算单元211,用于计算明文Jar包的SM3摘要值,记为SM3(OriginalJar),共32字节,该摘要值还会用于加载Jar包时的完整性校验。
随机数生成单元212,用于取得16字节随机数RND16。
异或单元213,用于将SM3(OriginalJar)的前16字节与后16字节异或,记为Key1。
随机数加密单元214,用于将Key1作为加密密钥对RND16进行SM4加密,即SM4-Enc(Key1,RND16),结果记为Key2。
SM4加密单元215,用于将Key2作为明文Jar包加密密钥,对Jar包进行SM4加密,结果为SM4-Enc(Key2,OriginalJar)。
密钥存放模块220,用于存放Jar包的加密密钥。
加密密钥包括32字节Hash值SM3(OriginalJar)和16字节随机数RND16,共48字节。密钥存放的方法如下:
将SM4-Enc(Key2,OriginalJar)分为49块,其中前48块用来随机存放加密密钥。加密密钥第1字节存放在第48块,存放位置由第49块的数据确定,加密密钥第2字节存放在第47块,存放位置由第48块数据加第1字节密钥值确定,依次类推。
其中,前48块每块大小为:Sizeof(Block1-48)=Sizeof(SM4-Enc(Key2,OriginalJar))/48,第49块大小为Sizeof(Block49)=Sizeof(SM4-Enc(Key2,OriginalJar))%48,Sizeof(Block49)可能为0。
进一步的,本实施例中确定密钥存放位置的算法为:
首先计算第49块数据的HASH值,记为SM3(Block49),然后将SM3(Block49)按字节相加,结果记为∑(SM3(Block49)),第1字节在第48块中的存放位置为∑(SM3(Block49))%Sizeof(Block1-48)+1,存放后构成新的第48块数据,记为Block48′。
然后计算Block48′的HASH值,记为SM3(Block48′),然后将SM3(Block48′)按字节相加,结果记为∑(SM3(Block48′)),第2字节在第47块中的存放位置为∑(SM3(Block48′))%Sizeof(Block1-48)+1,存放后构成新的第47块数据,记为Block47′。
依次类推,将加密密钥随机存放在密文Jar包的前48块,构成新的Block1-48′,由Block1-48′加上Block49构成最终的密文JAR包,即EncryptedJar。
密钥提取模块230,用于提取上述加密密钥。如图7所示,密钥提取模块230包括如下四个单元:
数据大小计算单元231,用于计算49块数据的大小,其中Sizeof(Block1-48)=Sizeof(EncryptedJar)/48-1,Sizeof(Block49)=Sizeof(EncryptedJar)%48。
第一数据还原单元232,用于获取第49块数据Block49和第48块数据Block48′,根据∑(SM3(Block49))%Sizeof(Block1-48)+1获取第1字节密钥在第48块中的存储位置,从而获取第一个字节的密钥值并还原第48块数据Block48。
第二数据还原单元233,用于根据∑(SM3(Block48′))%Sizeof(Block1-48)+1获取第2字节密钥在第47块中的存储位置,从而获取第二个字节的密钥值并还原第47块数据Block47。
原始数据获取单元234,用于获取48字节的密钥及原始的49块数据Block1-49。
Jar包解密模块240、用于调用上述解密库解密所述Jar包,解密成功后将Jar包加载到内存中,同时删除本地相关解密文件。
如图8所示,上述Jar包解密模块240具有如下三个单元:
异或及解密单元241,用于将48字节密钥值的前16字节与中间16字节异或,还原出Key1,使用Key1对后16字节密钥进行SM4解密,还原出Key2。
原始数据解密单元242,通过使用Key2对Block1-49进行SM4解密,即可还原出明文Jar包。
完整性校验单元243,用于对明文Jar包计算SM3摘要值,与加密密钥前32字节进行比较,验证Jar包的完整性。
本领域技术人员应该明白,本发明所述的方法和系统并不限于具体实施方式中所述的实施例,上面的具体描述只是为了解释本发明的目的,并非用于限制本发明。本领域技术人员根据本发明的技术方案得出其他的实施方式,同样属于本发明的技术创新范围,本发明的保护范围由权利要求及其等同物限定。