开发环境的加密方法、解密方法及装置、设备和介质转让专利

申请号 : CN202210173467.0

文献号 : CN114547653B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王柯浩孙大巍

申请人 : 科东(广州)软件科技有限公司

摘要 :

本申请实施例涉及计算机技术领域,且涉及一种开发环境的加密方法、解密方法及装置、设备和介质。其中,加密方法具体为:获取开发环境;生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对第一公钥进行加密和解密的第二私钥和第二公钥;对开发环境中的第一文件包进行解压处理,得到目标文件;利用第一私钥对目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用第二文件包替换第一文件包;利用第二私钥对第一公钥进行加密,生成公钥文件,并将公钥文件存于开发环境的指定位置。本申请实施例不易被反编译,无须加密有依赖关系的文件包,使得解密后文件与未加密之前的文件保持一致,保证开发环境和生产环境的一致性。

权利要求 :

1.一种开发环境的加密方法,其特征在于,包括:获取开发环境;

生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对所述第一公钥进行加密和解密的第二私钥和第二公钥;

对所述开发环境中的第一文件包进行解压处理,得到目标文件;

利用所述第一私钥对所述目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用所述第二文件包替换所述第一文件包;

利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,并将所述公钥文件存于所述开发环境的指定位置;

其中,利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,包括:利用摘要算法生成所述第一公钥的第一信息摘要,并采用预设编码方式对所述第一信息摘要进行编码,得到第一编码信息;

利用第二私钥对所述第一公钥和所述第一编码信息进行加密,得到加密信息,并采用预设编码方式对所述加密信息进行编码,得到第二编码信息;

将所述第二编码信息混淆在随机生成的第一字符串中,得到第二字符串;

利用摘要算法生成所述第二字符串的第二信息摘要,并采用预设编码方式对所述第二信息摘要进行编码,得到第三字符串;

根据所述第二字符串和所述第三字符串生成所述公钥文件。

2.根据权利要求1所述的方法,其特征在于,所述摘要算法包括MD5信息摘要算法;所述预设编码方式包括base64编码方式。

3.一种开发环境的解密方法,其特征在于,用于对如权利要求1或2所述的加密方法加密后的开发环境进行解密,所述方法包括:在运行加密后的开发环境的过程中,从动态链接库中获取第二公钥;

读取所述加密后的开发环境对应的公钥文件;

利用所述第二公钥对所述公钥文件进行解密,得到第一公钥;

利用所述第一公钥对所述加密后的开发环境中的第二文件包进行解密;

其中,利用所述第二公钥对所述公钥文件进行解密,得到第一公钥,包括:根据所述公钥文件中的第二字符串生成第三信息摘要,将所述第三信息摘要与所述公钥文件中的第三字符串进行比对,根据比对结果对所述公钥文件进行验证;

将所述公钥文件中的第二字符串解除混淆,得到第三编码信息;

根据预设编码方式将所述第三编码信息进行解码;

利用所述第二公钥,对所述解码后的编码信息进行解密,得到所述第一公钥和所述第一公钥的第一信息摘要;

将所述第一公钥和所述第一信息摘要进行比对,根据比对结果对所述公钥文件进行验证。

4.根据权利要求3所述的方法,其特征在于,从动态链接库中获取第二公钥,包括:利用本地接口程序加载所述动态链接库,所述动态链接库包括加壳处理后的动态链接库;

从所述加壳处理后的动态链接库中获取所述第二公钥。

5.一种开发环境的加密装置,其特征在于,包括:获取单元,用于获取开发环境;

生成单元,用于:生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对所述第一公钥进行加密和解密的第二私钥和第二公钥;

处理单元,用于:对所述开发环境中的第一文件包进行解压处理,得到目标文件;

第一加密单元,用于:利用所述第一私钥对所述目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用所述第二文件包替换所述第一文件包;

第二加密单元,用于:利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,并将所述公钥文件存于所述开发环境的指定位置;

其中,所述第二加密单元用于:

利用摘要算法生成所述第一公钥的第一信息摘要,并采用预设编码方式对所述第一信息摘要进行编码,得到第一编码信息;

利用第二私钥对所述第一公钥和所述第一编码信息进行加密,得到加密信息,并采用预设编码方式对所述加密信息进行编码,得到第二编码信息;

将所述第二编码信息混淆在随机生成的第一字符串中,得到第二字符串;

利用摘要算法生成所述第二字符串的第二信息摘要,并采用预设编码方式对所述第二信息摘要进行编码,得到第三字符串;

根据所述第二字符串和所述第三字符串生成所述公钥文件。

6.一种开发环境的解密装置,其特征在于,用于对如权利要求5 所述的加密装置加密后的开发环境进行解密,所述装置包括:获取单元,用于:在运行加密后的开发环境的过程中,从动态链接库中获取第二公钥;

读取单元,用于:读取所述加密后的开发环境对应的公钥文件;

第一解密单元,用于:利用所述第二公钥对所述公钥文件进行解密,得到第一公钥;

第二解密单元,用于:利用所述第一公钥对所述加密后的开发环境中的第二文件包进行解密;

其中,所述第一解密单元用于:

根据所述公钥文件中的第二字符串生成第三信息摘要,将所述第三信息摘要与所述公钥文件中的第三字符串进行比对,根据比对结果对所述公钥文件进行验证;

将所述公钥文件中的第二字符串解除混淆,得到第三编码信息;

根据预设编码方式将所述第三编码信息进行解码;

利用所述第二公钥,对所述解码后的编码信息进行解密,得到所述第一公钥和所述第一公钥的第一信息摘要;

将所述第一公钥和所述第一信息摘要进行比对,根据比对结果对所述公钥文件进行验证。

7.一种计算设备,其特征在于,包括:

通信接口;

至少一个处理器,其与所述通信接口连接;以及至少一个存储器,其与所述处理器连接并存储有程序指令,所述程序指令当被所述至少一个处理器执行时使得所述至少一个处理器执行权利要求1‑4任一所述的方法。

8.一种计算机可读存储介质,其上存储有程序指令,其特征在于,所述程序指令当被计算机执行时使得所述计算机执行权利要求1‑4任一所述的方法。

说明书 :

开发环境的加密方法、解密方法及装置、设备和介质

技术领域

[0001] 本发明涉及计算机技术领域,尤其涉及开发环境的加密方法、解密方法及装置、设备和介质。

背景技术

[0002] 现有的对开发环境进行加密的方式主要包括混淆代码等方式。以eclipse开发环境为例,eclipse开发环境运行所需的库都是以Java归档(Java ARchive,JAR)包形式存在。JAR包是许多类(class)文件的压缩。因此加密是对JAR包中的class文件进行加密。通常情况下对JAR包加密的方式包括混淆代码、使用Java代理(JavaAgent)技术和修改类加载器。
[0003] 在混淆代码的方式中,混淆JAR包可能导致有依赖关系的JAR包也必须混淆。无法仅混淆指定的JAR包。由于改变了class文件,会产生一些副作用,比如打印日志无法指向正确的class文件路径。因为开发环境和生产环境的代码不一致了,还有可能会出现一些无法预料的问题。而且混淆过程是不可逆的。另外,JAR包还是会被反编译,只是阅读难度大,仍有可能篡改开发环境的代码,安全性差。在使用JavaAgent技术和修改类加载器的方式中,解密过程是通过Java代码编写的,无法进行加密。

发明内容

[0004] 鉴于现有技术的以上问题,本申请实施例提供一种开发环境的加密方法、解密方法及装置、设备和介质,采用非对称加密不易被破解、反编译,只需加密指定的软件包,无须加密有依赖关系的软件包,并且使得解密后文件与未加密之前的文件保持一致,从而保证开发环境和生产环境的一致性。
[0005] 为达到上述目的,本申请第一方面提供了一种开发环境的加密方法,包括:
[0006] 获取开发环境;
[0007] 生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对所述第一公钥进行加密和解密的第二私钥和第二公钥;
[0008] 对所述开发环境中的第一文件包进行解压处理,得到目标文件;
[0009] 利用所述第一私钥对所述目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用所述第二文件包替换所述第一文件包;
[0010] 利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,并将所述公钥文件存于所述开发环境的指定位置。
[0011] 作为第一方面的一种可能的实现方式,利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,包括:
[0012] 利用摘要算法生成所述第一公钥的第一信息摘要,并采用预设编码方式对所述第一信息摘要进行编码,得到第一编码信息;
[0013] 利用第二私钥对所述第一公钥和所述第一编码信息进行加密,得到加密信息,并采用预设编码方式对所述加密信息进行编码,得到第二编码信息;
[0014] 将所述第二编码信息混淆在随机生成的第一字符串中,得到第二字符串;
[0015] 利用摘要算法生成所述第二字符串的第二信息摘要,并采用预设编码方式对所述第二信息摘要进行编码,得到第三字符串;
[0016] 根据所述第二字符串和所述第三字符串生成所述公钥文件。
[0017] 作为第一方面的一种可能的实现方式,所述摘要算法包括MD5信息摘要算法;所述预设编码方式包括base64编码方式。
[0018] 本申请第二方面提供了一种开发环境的解密方法,用于对上述第一方面的加密方法加密后的开发环境进行解密,包括:
[0019] 在运行加密后的开发环境的过程中,从动态链接库中获取第二公钥;
[0020] 读取所述加密后的开发环境对应的公钥文件;
[0021] 利用所述第二公钥对所述公钥文件进行解密,得到第一公钥;
[0022] 利用所述第一公钥对所述加密后的开发环境中的第二文件包进行解密。
[0023] 作为第二方面的一种可能的实现方式,利用所述第二公钥对所述公钥文件进行解密,得到第一公钥,包括:
[0024] 根据所述公钥文件中的第二字符串生成第三信息摘要,将所述第三信息摘要与所述公钥文件中的第三字符串进行比对,根据比对结果对所述公钥文件进行验证;
[0025] 将所述公钥文件中的第二字符串解除混淆,得到第三编码信息;
[0026] 根据预设编码方式将所述第三编码信息进行解码;
[0027] 利用所述第二公钥,对所述解码后的编码信息进行解密,得到所述第一公钥和所述第一公钥的第一信息摘要;
[0028] 将所述第一公钥和所述第一信息摘要进行比对,根据比对结果对所述公钥文件进行验证。
[0029] 作为第二方面的一种可能的实现方式,从动态链接库中获取第二公钥,包括:
[0030] 利用本地接口程序加载所述动态链接库,所述动态链接库包括加壳处理后的动态链接库;
[0031] 从所述加壳处理后的动态链接库中获取所述第二公钥。
[0032] 本申请第三方面提供了一种开发环境的加密装置,包括:
[0033] 获取单元,用于获取开发环境;
[0034] 生成单元,用于:生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对所述第一公钥进行加密和解密的第二私钥和第二公钥;
[0035] 处理单元,用于:对所述开发环境中的第一文件包进行解压处理,得到目标文件;
[0036] 第一加密单元,用于:利用所述第一私钥对所述目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用所述第二文件包替换所述第一文件包;
[0037] 第二加密单元,用于:利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,并将所述公钥文件存于所述开发环境的指定位置。
[0038] 作为第三方面的一种可能的实现方式,所述第二加密单元用于:
[0039] 利用摘要算法生成所述第一公钥的第一信息摘要,并采用预设编码方式对所述第一信息摘要进行编码,得到第一编码信息;
[0040] 利用第二私钥对所述第一公钥和所述第一编码信息进行加密,得到加密信息,并采用预设编码方式对所述加密信息进行编码,得到第二编码信息;
[0041] 将所述第二编码信息混淆在随机生成的第一字符串中,得到第二字符串;
[0042] 利用摘要算法生成所述第二字符串的第二信息摘要,并采用预设编码方式对所述第二信息摘要进行编码,得到第三字符串;
[0043] 根据所述第二字符串和所述第三字符串生成所述公钥文件。
[0044] 作为第三方面的一种可能的实现方式,所述摘要算法包括MD5信息摘要算法;所述预设编码方式包括base64编码方式。
[0045] 本申请第四方面提供了一种开发环境的解密装置,用于对上述第三方面的加密装置加密后的开发环境进行解密,包括:
[0046] 获取单元,用于:在运行加密后的开发环境的过程中,从动态链接库中获取第二公钥;
[0047] 读取单元,用于:读取所述加密后的开发环境对应的公钥文件;
[0048] 第一解密单元,用于:利用所述第二公钥对所述公钥文件进行解密,得到第一公钥;
[0049] 第二解密单元,用于:利用所述第一公钥对所述加密后的开发环境中的第二文件包进行解密。
[0050] 作为第四方面的一种可能的实现方式,所述第一解密单元用于:
[0051] 根据所述公钥文件中的第二字符串生成第三信息摘要,将所述第三信息摘要与所述公钥文件中的第三字符串进行比对,根据比对结果对所述公钥文件进行验证;
[0052] 将所述公钥文件中的第二字符串解除混淆,得到第三编码信息;
[0053] 根据预设编码方式将所述第三编码信息进行解码;
[0054] 利用所述第二公钥,对所述解码后的编码信息进行解密,得到所述第一公钥和所述第一公钥的第一信息摘要;
[0055] 将所述第一公钥和所述第一信息摘要进行比对,根据比对结果对所述公钥文件进行验证。
[0056] 作为第四方面的一种可能的实现方式,所述获取单元用于:
[0057] 利用本地接口程序加载所述动态链接库,所述动态链接库包括加壳处理后的动态链接库;
[0058] 从所述加壳处理后的动态链接库中获取所述第二公钥。
[0059] 本申请第五方面提供了一种计算设备,包括:
[0060] 通信接口;
[0061] 至少一个处理器,其与所述通信接口连接;以及
[0062] 至少一个存储器,其与所述处理器连接并存储有程序指令,所述程序指令当被所述至少一个处理器执行时使得所述至少一个处理器执行上述第一方面任一所述的方法。
[0063] 本申请第六方面提供了一种计算机可读存储介质,其上存储有程序指令,所述程序指令当被计算机执行时使得所述计算机执行上述第一方面任一所述的方法。
[0064] 本发明的这些和其它方面在以下(多个)实施例的描述中会更加简明易懂。

附图说明

[0065] 以下参照附图来进一步说明本发明的各个特征和各个特征之间的联系。附图均为示例性的,一些特征并不以实际比例示出,并且一些附图中可能省略了本申请所涉及领域的惯常的且对于本申请非必要的特征,或是额外示出了对于本申请非必要的特征,附图所示的各个特征的组合并不用以限制本申请。另外,在本说明书全文中,相同的附图标记所指代的内容也是相同的。具体的附图说明如下:
[0066] 图1为本申请实施例提供的开发环境的加密方法的一实施例的示意图;
[0067] 图2为本申请实施例提供的开发环境的加密方法的一实施例的示意图;
[0068] 图3为本申请实施例提供的开发环境的加密方法的一实施例的示意图;
[0069] 图4为本申请实施例提供的开发环境的解密方法的一实施例的示意图;
[0070] 图5为本申请实施例提供的开发环境的解密方法的一实施例的示意图;
[0071] 图6为本申请实施例提供的开发环境的解密方法的一实施例的示意图;
[0072] 图7为本申请实施例提供的开发环境的加密装置的一实施例的示意图;
[0073] 图8为本申请实施例提供的开发环境的解密装置的一实施例的示意图;
[0074] 图9为本申请实施例提供的计算设备的示意图。

具体实施方式

[0075] 说明书和权利要求书中的词语“第一、第二、第三等”或模块A、模块B、模块C等类似用语,仅用于区别类似的对象,不代表针对对象的特定排序,可以理解地,在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
[0076] 在以下的描述中,所涉及的表示步骤的标号,如S110、S120……等,并不表示一定会按此步骤执行,在允许的情况下可以互换前后步骤的顺序,或同时执行。
[0077] 说明书和权利要求书中使用的术语“包括”不应解释为限制于其后列出的内容;它不排除其它的元件或步骤。因此,其应当诠释为指定所提到的所述特征、整体、步骤或部件的存在,但并不排除存在或添加一个或更多其它特征、整体、步骤或部件及其组群。因此,表述“包括装置A和B的设备”不应局限为仅由部件A和B组成的设备。
[0078] 本说明书中提到的“一个实施例”或“实施例”意味着与该实施例结合描述的特定特征、结构或特性包括在本发明的至少一个实施例中。因此,在本说明书各处出现的用语“在一个实施例中”或“在实施例中”并不一定都指同一实施例,但可以指同一实施例。此外,在一个或多个实施例中,能够以任何适当的方式组合各特定特征、结构或特性,如从本公开对本领域的普通技术人员显而易见的那样。
[0079] 除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。如有不一致,以本说明书中所说明的含义或者根据本说明书中记载的内容得出的含义为准。另外,本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。为了准确地对本申请中的技术内容进行叙述,以及为了准确地理解本发明,在对具体实施方式进行说明之前先对本说明书中所使用的术语给出如下的解释说明或定义:
[0080] 1)MD5信息摘要算法(英语:MD5 Message‑Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5信息摘要算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
[0081] 2)Base64:是网络上最常见的用于传输8Bit字节码的编码方式之一。Base64是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在超文本传输协议(Hyper Text Transfer Protocol,HTTP)环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。
[0082] 3)Eclipse:是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它是一个框架和一组服务,用于通过插件组件构建开发环境。Eclipse附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
[0083] 4)Java归档(Java ARchive,JAR):在软件领域,JAR文件是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发Java平台应用软件或库。
[0084] 5)加壳:是利用特殊的算法,对可执行文件里的资源进行压缩。这个压缩之后的文件,可以独立运行。解压过程完全隐蔽,都在内存中完成。加壳后的可执行文件附加在原程序上通过加载器载入内存后,先于原始程序执行,得到控制权,执行过程中对原始程序进行解密、还原,还原完成后再把控制权交还给原始程序,执行原来的代码部分。加上外壳后,原始程序代码在磁盘文件中一般是以加密后的形式存在的,只在执行时在内存中还原,这样就可以比较有效地防止破解者对程序文件的非法修改,同时也可以防止程序被静态反编译。
[0085] 6)SVN(subversion):是一个开放源代码的版本控制系统。该系统通过采用分支管理系统的高效管理,简而言之就是用于多个人共同开发同一个项目,实现共享资源,实现最终集中式的管理。
[0086] 下面先对现有的方法进行介绍,然后再对本申请的技术方案进行详细介绍。
[0087] 现有技术:以eclipse开发环境为例,通常情况下对JAR包加密包括以下方式:
[0088] (1)混淆代码。该方式是将JAR包中的包路径替换为a.b.c.d这种无意义的路径,将类名、方法名也替换成无意义的名字。通过这种方式增加阅读代码难度。
[0089] (2)加密class文件,然后使用JavaAgent技术或通过修改类加载器的方式,在class文件加载到内存时解密。
[0090] 以上混淆代码的方式具有以下缺陷:
[0091] (1)在进行混淆JAR包的操作中,可能导致与指定JAR包有依赖关系的JAR包也必须被混淆。这种情况下可能无法仅混淆指定的JAR包。混淆了有依赖关系的JAR包可能导致一些无法预料的问题。
[0092] (2)由于改变了class文件,会产生一些副作用。比如打印日志无法指向正确的class文件路径。因为开发和生成环境的代码不一致了,还有可能会出现一些无法预料的问题。而且混淆过程是不可逆的。
[0093] (3)JAR包还是会被反编译,只是阅读难度大,仍有可能篡改开发环境的代码,安全性差。
[0094] 以上使用JavaAgent技术和修改类加载器的方式有以下缺点:解密过程是通过Java代码编写的,无法进行加密。以类加载器为例,在解密过程中首先需要运行类加载器,如果类加载器本身也被加密了,则类加载器的解密过程无法进行,因为解密代码写在类加载器中了。因此解密代码本身无法进行加密。以eclipse开发环境为例,类加载器解密的方式,基本无法用于eclipse的加密和解密。eclipse开发环境的类加载器是eclipse自己实现的一套底层框架,其本身无法被加密。
[0095] 基于上述现有技术所存在的技术问题,本申请提供了一种开发环境的加密和开发环境的解密的方法。本申请实施例通过非对称加密算法对class文件进行加密,调用动态链接库对class文件进行解密。基于以上技术手段,可以仅对指定的JAR包进行加密,不会同时加密有依赖关系的jar包。由于没有替换JAR包中的包路径,也没有替换类名、方法名,使得解密后的程序文件与未进行加密之前的程序文件保持一致,从而可以保证软件开发环境和生产环境的一致性。另外,采用非对称加密的方式对软件包进行加密,不易被破解、反编译,解决了现有技术中提到的代码可能被篡改、安全性差的问题。另外,由于本申请实施例调用动态链接库对class文件进行解密,不需要使用JavaAgent技术和修改类加载器,解密过程不是通过java代码编写的,可以进行加密,解决了现有技术中提到的解密过程无法进行加密的问题。
[0096] 图1为本申请实施例提供的开发环境的加密方法的一实施例的示意图。如图1所示,该开发环境的加密方法可以包括:
[0097] 步骤S110,获取开发环境;
[0098] 步骤S120,生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对所述第一公钥进行加密和解密的第二私钥和第二公钥;
[0099] 步骤S130,对所述开发环境中的第一文件包进行解压处理,得到目标文件;
[0100] 步骤S140,利用所述第一私钥对所述目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用所述第二文件包替换所述第一文件包;
[0101] 步骤S150,利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,并将所述公钥文件存于所述开发环境的指定位置。
[0102] 本申请实施例中,采用非对称加密算法对文件包进行加密。其中,文件包可包括开发环境中的软件包。软件包(SoftWare Package)是指具有特定的功能,用来完成特定任务的一个程序或一组程序。例如,可以将Java程序打包成JAR文件。eclipse开发环境中的软件包通常以JAR包的形式存在。
[0103] 非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
[0104] 图2为本申请实施例提供的开发环境的加密方法的一实施例的示意图。参见图1和图2,在步骤S110中,可从指定位置获取开发环境。在步骤S120中,可使用开放式安全套接层协议(Open Secure Sockets Layer,OpenSSL)生成公私钥对。OpenSSL软件包的功能部分包括密码算法库。利用OpenSSL可实现非对称加密算法和信息摘要算法。
[0105] 本申请实施例中,利用OpenSSL生成的第一公私钥对可包括用于对文件包进行加密和解密的第一私钥和第一公钥。其中,第一公私钥对是一对临时生成的公私钥。利用OpenSSL生成的第二公私钥对可包括用于对所述第一公钥进行加密和解密的第二私钥和第二公钥。其中,第二公私钥对也称为“根公私钥”,是一对保持不变的公私钥。第二公钥也称为“根公钥”;第二私钥也称为“根私钥”。
[0106] 在开发环境中,对于软件的每一个版本,都对应有一个打包过程。在这个打包过程中会把需要加密的JAR包进行加密。本申请实施例中,每一次打包过程都可以使用不同的公私钥,则不同版本之间的公私钥是不会通用的。
[0107] 本申请实施例中,可对开发环境中指定的第一文件包进行加密处理。具体地,首先在步骤S130中,对开发环境中的第一文件包进行解压处理,得到目标文件。然后在步骤S140中,利用第一私钥对步骤S130中得到的目标文件进行加密处理。再将加密后的目标文件压缩为第二文件包,并在开发环境中将第一文件包替换为第二文件包。
[0108] 参见图1和图2,在步骤S140中,通过第一私钥加密JAR包的class文件。在这一步骤中,还可以在文件的起始几个字节设置魔数,表明该文件是加密后的文件。
[0109] 大多数情况下,都是通过扩展名来识别一个文件的类型的。比如一个.txt类型的文件是一个纯文本文件。但是,扩展名是可以修改的,当一个文件的扩展名被修改过,识别一个文件的类型就用到了“魔数”。很多类型的文件中,其起始的几个字节的内容是固定的。有些情况下这个内容是有意填充,还有些情况下这个内容是本就如此的。因为根据这几个字节的内容就可以确定文件类型,这几个字节的内容也被称为魔数。有了这些魔术数字,就可以很方便地区别不同的文件。
[0110] 在步骤S150中,通过根第二私钥加密第一公钥,生成公钥文件。本申请实施例中,可在开发环境中生成指定的第一文件包的公钥文件。则在运行开发环境时对加密后的第一文件包进行解密,也就是对第二文件包进行解密,利用第二公钥和步骤S150中生成的公钥文件对第二文件包包进行解密。
[0111] 本申请实施例采用非对称算法对开发环境进行加密,与混淆代码的方式不同。因此在对开发环境加密的过程中,只需要加密指定的文件包,不需要同时加密有依赖关系的文件包,并且使得解密后的程序文件与未进行加密之前的程序文件保持一致,从而可以保证软件开发环境和生产环境的一致性。另外,采用非对称加密的方式对开发环境进行加密,不易被破解、反编译,提升了数据安全性。
[0112] 图3为本申请实施例提供的开发环境的加密方法的一实施例的示意图。如图3所示,在一种实施方式中,图1中的步骤S150,利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,具体可包括:
[0113] 步骤S310,利用摘要算法生成所述第一公钥的第一信息摘要,并采用预设编码方式对所述第一信息摘要进行编码,得到第一编码信息;
[0114] 步骤S320,利用第二私钥对所述第一公钥和所述第一编码信息进行加密,得到加密信息,并采用预设编码方式对所述加密信息进行编码,得到第二编码信息;
[0115] 步骤S330,将所述第二编码信息混淆在随机生成的第一字符串中,得到第二字符串;
[0116] 步骤S340,利用摘要算法生成所述第二字符串的第二信息摘要,并采用预设编码方式对所述第二信息摘要进行编码,得到第三字符串;
[0117] 步骤S350,根据所述第二字符串和所述第三字符串生成所述公钥文件。
[0118] 在一种实施方式中,所述摘要算法包括MD5信息摘要算法;所述预设编码方式包括base64编码方式。
[0119] 一个示例性的公钥文件生成过程可包括以下步骤:
[0120] 1)获取第一公钥的16位MD5摘要,将上述第一公钥的MD5摘要称为第一信息摘要。采用base64编码方式对上述第一公钥的MD5摘要进行编码,得到第一编码信息。
[0121] 2)使用根私钥将第一公钥、第一编码信息加密,得到加密信息。采用base64编码方式对上述加密信息进行编码,得到的字符串称为第二编码信息。
[0122] 3)生成100行、每行1024个字节的随机字符串,该随机字符串称为第一字符串。把步骤2)中生成的字符串通过自定义算法混淆在上述100行随机字符串中,得到第二字符串。例如,将步骤2)中生成的字符串拆分成100份子串,将该100份子串随机替换到100行随机字符串中。在第1行随机字符串中的固定位置替换第1份子串,在固定位置的后面替换为下一份字符串的偏移、长度。依次类推,一直替换到第100行字符串。替换后的结果是100行、每行
1024个字节的字符串,即第二字符串。
[0123] 4)生成第二字符串的md5摘要,将上述第二字符串的MD5摘要称为第二信息摘要。采用base64编码方式对上述第二信息摘要进行编码,得到第三字符串。
[0124] 5)将第二字符串作为公钥文件的前100行,将第三字符串作为公钥文件的第101行。将上述组合后的101行字符串存储到公钥文件中。
[0125] 本申请实施例中,利用摘要算法、预设编码方式和自定义算法对第一公钥进行加密,得到公钥文件。使得在后续开发环境的运行的过程中,只有对公钥文件进行解密才能获得第一公钥,通过该方式进一步保障了开发环境的的数据安全性。
[0126] 图4为本申请实施例提供的开发环境的解密方法的一实施例的示意图。如图4所示,该解密方法可用于对上述加密方法加密后的开发环境进行解密,该开发环境的解密方法可以包括:
[0127] 步骤S410,在运行加密后的开发环境的过程中,从动态链接库中获取第二公钥;
[0128] 步骤S420,读取所述加密后的开发环境对应的公钥文件;
[0129] 步骤S430,利用所述第二公钥对所述公钥文件进行解密,得到第一公钥;
[0130] 步骤S440,利用所述第一公钥对所述加密后的开发环境中的第二文件包进行解密。
[0131] 在开发环境中可利用本申请实施例提供的开发环境的加密方法对指定文件包进行加密,得到加密后的开发环境。本申请实施例中,在运行加密后的开发环境的过程中,可通过Java本地接口(Java Native Interface,JNI)技术对软件包中的class文件进行解密。其中,JNI是用Java代码调用本地动态链接库(Dynamic Link Library,DLL)库(C/C++库)的技术。JNI通过使用Java本地接口书写程序,可以确保代码在不同的平台上方便移植。JNI是为了本地已编译语言,例如C和C++而设计的。JNI标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
[0132] 图5为本申请实施例提供的开发环境的解密方法的一实施例的示意图。参见图4和图5,在步骤S410中,在开发环境启动时,可通过JNI技术,加载DLL库。从DLL库中获取第二公钥,用于在软件包中的class文件加载到内存时,对class文件进行解密。
[0133] 在步骤S420中,读取在加密过程中步骤S130生成的公钥文件。
[0134] 在步骤S430中,通过第二公钥(也称根公钥)解密公钥文件,得到第一公钥。
[0135] 在步骤S440中,在class文件加载到内存时,通过第一公钥解密第二文件包中的class文件。
[0136] 在一种实施方式中,在class文件加载到内存时,可以通过魔数判断出该文件是加密文件,然后通过第一公钥解密该class文件。
[0137] 本申请实施例中,在开发环境中可对指定文件包进行加密,在运行加密后的开发环境的过程中对文件包进行解密,使得解密后的程序文件与未进行加密之前的程序文件保持一致,从而可以保证软件开发环境和生产环境的一致性。
[0138] 图6为本申请实施例提供的开发环境的解密方法的一实施例的示意图。如图6所示,在一种实施方式中,图4中的步骤S430,利用所述第二公钥对所述公钥文件进行解密,得到第一公钥,具体可包括:
[0139] 步骤S610,根据所述公钥文件中的第二字符串生成第三信息摘要,将所述第三信息摘要与所述公钥文件中的第三字符串进行比对,根据比对结果对所述公钥文件进行验证;
[0140] 步骤S620,将所述公钥文件中的第二字符串解除混淆,得到第三编码信息;
[0141] 步骤S630,根据预设编码方式将所述第三编码信息进行解码;
[0142] 步骤S640,利用所述第二公钥,对所述解码后的编码信息进行解密,得到所述第一公钥和所述第一公钥的第一信息摘要;
[0143] 步骤S650,将所述第一公钥和所述第一信息摘要进行比对,根据比对结果对所述公钥文件进行验证。
[0144] 一个示例性的公钥文件解密过程可包括以下步骤:
[0145] 1)获取公钥文件中的第二字符串,即获取公钥文件中的前100行字符串。根据公钥文件中的前100行字符串生成MD5摘要,该MD5摘要称为第三信息摘要。将第三信息摘要与公钥文件中的第三字符串进行比对,即将第三信息摘要与公钥文件中的第101行进行比对,根据比对结果对公钥文件进行验证。如果比对结果是两者信息一致,则说明该公钥文件没有被篡改过。通过这种方式可保证所使用的公钥文件没被篡改过,保证软件包的数据安全性。
[0146] 2)将公钥文件中的第二字符串按照自定义算法解除混淆,即将公钥文件中的前100行字符串按照自定义算法解除混淆,得到第三编码信息。
[0147] 3)根据预设编码方式将步骤2)中得到的第三编码信息进行解码。
[0148] 4)使用第二公钥,即使用根公钥对步骤3)中解码后的编码信息进行解密,得到第一公钥和第一公钥的第一信息摘要。
[0149] 5)将步骤4)中得到的第一公钥和第一信息摘要进行比对,根据比对结果对公钥文件进行验证。如果比对结果是两者信息一致,则说明该公钥文件没有被篡改过。通过这种方式可以进一步保证所使用的公钥文件没被篡改过,保证软件包的数据安全性。
[0150] 本发明实施例中,第一私钥和第二私钥是在加密开发环境的过程中使用,是可以设法保证不会被泄密的。在开发环境进行打包时,可使用一个专门用于打包的JAR文件,里面存储有第一私钥和第二私钥。这个JAR文件是可以单独运行的程序。通过运行这个JAR文件执行JAR包的加密过程。解密过程中不需要这个JAR包,因此不会放到产品包中。
[0151] 在一种这实施方式中,从动态链接库中获取第二公钥,包括:
[0152] 利用本地接口程序加载所述动态链接库,所述动态链接库包括加壳处理后的动态链接库;
[0153] 从所述加壳处理后的动态链接库中获取所述第二公钥。
[0154] 本发明实施例中,第一公钥是通过第二私钥加密,第二公钥解密。第二公钥是可以硬编码在DLL库中,然后对DLL库进行了加密。第二公钥是一段字符串,该字符串是在C++源码中的。C++源码编译生成DLL库后,这段字符串可以在DLL库搜索出来。对DLL库加密加壳后,就无法搜索出第二公钥了。通过这种方式,使用DLL库的加密技术对第二公钥进行保护。
[0155] 在对加密后的软件包进行解密的过程中,可通过JNI加载加壳处理后的DLL库。可先从加壳处理后的DLL库中获取第二公钥,用于对class文件进行解密。
[0156] 在另一种实施方式中,解密流程中,解除混淆的自定义算法,也是存放在DLL库中。
[0157] 由于本申请实施例调用动态链接库对class文件进行解密,不需要使用JavaAgent技术和修改类加载器。解密过程不是通过Java代码编写的,可以进行加密。通过对解密过程进行加密,进一步提升了数据安全性。
[0158] 本申请实施中,可在开发环境将本申请实施例提供的开发环境的加密方法用于一套加密系统中。在一个示例中,开发环境的加密和解密流程如下:
[0159] 一、启动加密系统。
[0160] 1)从固定位置获取开发环境。其中,固定位置可包括本地、SVN等。
[0161] 2)调用OpenSSL生成第一私钥、第一公钥、第二私钥和第二公钥,并保存到数据库中。
[0162] 3)加密开发环境中的JAR包。具体地,将JAR包解压成文件夹,里面包含需要加密的class文件。迭代每个class文件,使用第一私钥对其进行加密,并添加魔数。将加密后的class文件压缩成JAR包,用其替换原有的JAR包。
[0163] 4)使用第二私钥加密第一公钥,生成公钥文件。将公钥文件存放在开发环境下的指定位置,得到加密后的开发环境。
[0164] 5)验证加密后的开发环境可以正常解密。
[0165] 二、运行开发环境。
[0166] 1)启动开发环境,加载DLL库。
[0167] 2)读取公钥文件,解密出第一公钥。
[0168] 3)判断class文件是否是加密文件。使用第一公钥解密class文件,将class文件加载入内存使用。
[0169] 4)开发环境正常运行。
[0170] 如图7所示,本申请还提供了相应的一种开发环境的加密装置的实施例,关于该装置的有益效果或解决的技术问题,可以参见与各装置分别对应的方法中的描述,或者参见发明内容中的描述,此处不再一一赘述。
[0171] 在该开发环境的加密装置的实施例中,该装置包括:
[0172] 获取单元710,用于获取开发环境;
[0173] 生成单元720,用于:生成用于加密和解密的第一私钥和第一公钥,以及,生成用于对所述第一公钥进行加密和解密的第二私钥和第二公钥;
[0174] 处理单元730,用于:对所述开发环境中的第一文件包进行解压处理,得到目标文件;
[0175] 第一加密单元740,用于:利用所述第一私钥对所述目标文件进行加密处理,并将加密后的目标文件压缩为第二文件包,并利用所述第二文件包替换所述第一文件包;
[0176] 第二加密单元750,用于:利用所述第二私钥对所述第一公钥进行加密,生成公钥文件,并将所述公钥文件存于所述开发环境的指定位置。
[0177] 在一种实施方式中,所述第二加密单元750用于:
[0178] 利用摘要算法生成所述第一公钥的第一信息摘要,并采用预设编码方式对所述第一信息摘要进行编码,得到第一编码信息;
[0179] 利用第二私钥对所述第一公钥和所述第一编码信息进行加密,得到加密信息,并采用预设编码方式对所述加密信息进行编码,得到第二编码信息;
[0180] 将所述第二编码信息混淆在随机生成的第一字符串中,得到第二字符串;
[0181] 利用摘要算法生成所述第二字符串的第二信息摘要,并采用预设编码方式对所述第二信息摘要进行编码,得到第三字符串;
[0182] 根据所述第二字符串和所述第三字符串生成所述公钥文件。
[0183] 在一种实施方式中,所述摘要算法包括MD5信息摘要算法;所述预设编码方式包括base64编码方式。
[0184] 如图8所示,本申请还提供了相应的一种开发环境的解密装置的实施例,关于该装置的有益效果或解决的技术问题,可以参见与各装置分别对应的方法中的描述,或者参见发明内容中的描述,此处不再一一赘述。
[0185] 在该开发环境的解密装置的实施例中,该装置包括:
[0186] 获取单元810,用于:在运行加密后的开发环境的的过程中,从动态链接库中获取第二公钥;
[0187] 读取单元820,用于:读取所述加密后的开发环境对应的公钥文件;
[0188] 第一解密单元830,用于:利用所述第二公钥对所述公钥文件进行解密,得到第一公钥;
[0189] 第二解密单元840,用于:利用所述第一公钥对所述加密后的开发环境中的第二文件包进行解密。
[0190] 在一种实施方式中,所述第一解密单元830用于:
[0191] 根据所述公钥文件中的第二字符串生成第三信息摘要,将所述第三信息摘要与所述公钥文件中的第三字符串进行比对,根据比对结果对所述公钥文件进行验证;
[0192] 将所述公钥文件中的第二字符串解除混淆,得到第三编码信息;
[0193] 根据预设编码方式将所述第三编码信息进行解码;
[0194] 利用所述第二公钥,对所述解码后的编码信息进行解密,得到所述第一公钥和所述第一公钥的第一信息摘要;
[0195] 将所述第一公钥和所述第一信息摘要进行比对,根据比对结果对所述公钥文件进行验证。
[0196] 在一种实施方式中,所述获取单元810用于:
[0197] 利用本地接口程序加载所述动态链接库,所述动态链接库包括加壳处理后的动态链接库;
[0198] 从所述加壳处理后的动态链接库中获取所述第二公钥。
[0199] 图9是本申请实施例提供的一种计算设备900的结构性示意性图。该计算设备900包括:处理器910、存储器920、通信接口930。
[0200] 应理解,图9中所示的计算设备900中的通信接口930可以用于与其他设备之间进行通信。
[0201] 其中,该处理器910可以与存储器920连接。该存储器920可以用于存储该程序代码和数据。因此,该存储器920可以是处理器910内部的存储单元,也可以是与处理器910独立的外部存储单元,还可以是包括处理器910内部的存储单元和与处理器910独立的外部存储单元的部件。
[0202] 可选的,计算设备900还可以包括总线。其中,存储器920、通信接口930可以通过总线与处理器910连接。总线可以是外设部件互连标准(Peripheral  Component Interconnect,PCI)总线或扩展工业标准结构(Extended Industry  Standard Architecture,EISA)总线等。所述总线可以分为地址总线、数据总线、控制总线等。
[0203] 应理解,在本申请实施例中,该处理器910可以采用中央处理单元(central processing unit,CPU)。该处理器还可以是其它通用处理器、数字信号处理器(digital signal processor,DSP)、专用集成电路(Application specific integrated circuit,ASIC)、现成可编程门矩阵(field programmable gate Array,FPGA)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。或者该处理器910采用一个或多个集成电路,用于执行相关程序,以实现本申请实施例所提供的技术方案。
[0204] 该存储器920可以包括只读存储器和随机存取存储器,并向处理器910提供指令和数据。处理器910的一部分还可以包括非易失性随机存取存储器。例如,处理器910还可以存储设备类型的信息。
[0205] 在计算设备900运行时,所述处理器910执行所述存储器920中的计算机执行指令执行上述方法的操作步骤。
[0206] 应理解,根据本申请实施例的计算设备900可以对应于执行根据本申请各实施例的方法中的相应主体,并且计算设备900中的各个模块的上述和其它操作和/或功能分别为了实现本实施例各方法的相应流程,为了简洁,在此不再赘述。
[0207] 本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
[0208] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0209] 在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0210] 所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0211] 另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0212] 所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read‑Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
[0213] 本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时用于执行一种多样化问题生成方法,该方法包括上述各个实施例所描述的方案中的至少之一。
[0214] 本申请实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是,但不限于,电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD‑ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0215] 计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
[0216] 计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括、但不限于无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0217] 可以以一种或多种程序设计语言或其组合来编写用于执行本申请操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言—诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0218] 注意,上述仅为本申请的较佳实施例及所运用的技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本申请进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明的构思的情况下,还可以包括更多其他等效实施例,均属于本发明的保护范畴。