一种程序的加密解密方法、装置和可读存储介质与流程

文档序号:26787817发布日期:2021-09-28 22:07阅读:68来源:国知局
一种程序的加密解密方法、装置和可读存储介质与流程

1.本技术涉及计算机信息科学技术领域,尤其涉及一种程序的加密解密方法、装置和计算机可读存储介质。


背景技术:

2.目前对于需求一定安全性的程序,例如侧重安全的客户端程序,为了保障数据传输的安全、内存中临时数据的安全,在所有与其他服务器交互数据过程都需要进行加密和解密的操作,因此程序中的加密解密功能线程会使用到大量的各种加解密算法,而这些加解密算法会创建一个独立的指针对象,即加密对象指针进行管理和调用。
3.具体来说,加密对象指针中封装了所有加解密的接口,如果线程需要使用加密算法则创建一个加密对象指针来调用其加解密接口来实现数据的加解密功能。目前程序的每个线程在每次调用加解密算法时都会创建新的加密对象指针,因此会重复创建多个相同类型的加密对象指针,而在对新建的加密对象指针进行初始化的同时,将初始化所有线程的加解密库,因此不断新建大量的加密对象指针将会消耗大量的计算资源。因此,需求一种能够解决大量创建加密对象指针导致占用过多的系统资源的解决方案。


技术实现要素:

4.本发明提供了一种程序的加密解密方法、装置和可读存储介质,以解决或者部分解决现有技术中加密对象指针大量重复创建,导致占用较多的系统计算资源的技术问题。
5.为解决上述技术问题,本发明提供了一种程序的加密解密方法,程序包括一个以上的线程,线程用于实施加密处理或解密处理;一个线程对应一个空闲加密对象指针池;一个空闲加密对象指针池中包括一个以上的空闲加密对象指针;其中,空闲加密对象指针由对应的加密对象指针持有管理器进行管理;加密解密方法包括:
6.在第一线程调用空闲加密对象指针时,加密对象指针控制管理器遍历第一空闲加密对象指针链表,确定是否存在第一目标空闲加密对象指针;其中,第一空闲加密对象指针链表属于第一线程对应的第一空闲加密对象指针池;
7.若存在第一目标空闲加密对象指针,第一线程调用第一目标空闲加密对象指针;
8.若不存在第一目标空闲加密对象指针,加密对象指针控制管理器从第二加密对象指针链表中确定是否存在第二目标空闲加密对象指针;其中,第二加密对象指针链表包括所有空闲加密对象指针池和所有空闲加密对象指针;第二目标空闲加密对象指针属于第二线程对应的第二空闲加密对象指针池;
9.若存在第二目标空闲加密对象指针,第一线程通过加密对象指针控制管理器将第二目标空闲加密对象指针与第二线程解绑,第一线程绑定并调用第二目标空闲加密对象指针;
10.若不存在第二目标空闲加密对象指针,第一线程新建目标加密对象指针;
11.第一线程使用第一目标空闲加密对象指针、第二目标空闲加密对象指针和目标加
密对象指针中的其中一种,进行数据的加密处理或解密处理。
12.可选的,空闲加密对象指针池中的空闲加密对象指针满足第一预设条件,第一预设条件包括:空闲加密对象指针的使用时间在预设时间以内;且空闲加密对象指针没有被关闭;且空闲加密对象指针可复用;
13.空闲加密对象指针由对应的加密对象指针持有管理器进行管理,具体包括:
14.加密对象指针持有管理器判断空闲加密对象指针是否满足第一预设条件;
15.若是,加密对象指针持有管理器将空闲加密对象指针存储至空闲加密对象指针池;其中,空闲加密对象指针池对应于空闲加密对象指针当前绑定的线程;
16.若否,关闭空闲加密对象指针。
17.可选的,第一目标空闲加密对象指针和第二目标空闲加密对象指针满足第二预设条件,第二预设条件包括:第一目标空闲加密对象指针或第二标空闲加密对象指针的类型与线程需求的加密对象指针的类型相同。
18.如上述的技术方案,加解密方法还包括:
19.加密对象指针控制管理器遍历第一空闲加密对象指针链表,判断第一空闲加密对象指针链表是否为空;
20.若第一空闲加密对象指针链表非空,从第一空闲加密对象指针链表中取出第一空闲加密对象指针对应的第一空闲加密对象指针持有管理器;其中,在第一空闲加密对象指针链表中的符合第二预设条件的全部空闲加密对象指针队列里,第一空闲加密对象指针具有最长的空闲时间;
21.判断第一空闲加密对象指针持有管理器管理的第一空闲加密对象指针在当前时刻下的使用时间是否超时;若第一空闲加密对象指针未超时,将第一空闲加密对象指针确定为第一目标空闲加密对象指针;
22.若第一空闲加密对象指针超时,第一空闲加密对象指针持有管理器先关闭第一空闲加密对象指针,加密对象指针控制管理器再取出第二空闲加密对象指针对应的第二空闲加密对象指针持有管理器;其中,在第一空闲加密对象指针链表中的符合第二预设条件且未关闭的空闲加密对象指针队列里,第二空闲加密对象指针具有最长的空闲时间且在当前时刻下使用时间未超时;
23.将第二空闲加密对象指针确定为第一目标空闲加密对象指针。
24.如上述的技术方案,加解密方法还包括:
25.加密对象指针控制管理器判断第二空闲加密对象指针链表是否为空;
26.若第二空闲加密对象指针链表非空,从第二空闲加密对象指针链表中确认符合第二预设条件的第三空闲加密对象指针;其中,在第二空闲加密对象指针链表中的符合第二预设条件的全部空闲加密对象指针队列里,第三空闲加密对象指针具有最长的空闲时间;
27.判断第三空闲加密对象指针在当前时刻的使用时间是否超时;
28.若第三空闲加密对象指针未超时,将第三空闲加密对象指针确认为第二目标空闲加密对象指针;
29.若第三空闲加密对象指针超时,先关闭第三空闲加密对象指针,再将第四空闲加密对象指针确认为第二目标空闲加密对象指针;其中,在第二空闲加密对象指针链表中的符合第二预设条件且未关闭的空闲加密对象指针队列里,第四空闲加密对象指针具有最长
的空闲时间且在当前时刻下未超时。
30.进一步的,加密对象指针控制管理器包括无序的关联式映射map容器,关联式映射map容器中存储第二空闲加密对象指针链表中所有的空闲加密对象指针的指针,空闲加密对象指针的指针属于迭代器;
31.在关闭第三空闲加密对象指针之后,还包括:
32.将第三空闲加密对象指针从第二空闲加密对象指针链表中移除;
33.将第三目标空闲加密对象指针的指针从关联式映射map容器中移除。
34.如上述的技术方案,第一线程通过加密对象指针控制管理器将第二目标空闲加密对象指针与第二线程解绑,具体包括:
35.第一线程通过加密对象指针控制管理器向第二线程投递摘除函数,以使第二线程与第二目标空闲加密对象指针解绑;
36.在第二线程与第二目标空闲加密对象指针解绑后,第二线程向第一线程投递摘除信号量;
37.第一线程绑定第二目标空闲加密对象指针,具体包括:
38.第一线程根据摘除信号量,进行第二目标空闲加密对象指针的绑定。
39.基于前述技术方案相同的发明构思,本发明提供了一种程序的加密解密装置,程序包括一个以上的线程,线程用于实施加密处理或解密处理;一个线程对应一个空闲加密对象指针池;一个空闲加密对象指针池中包括一个以上的空闲加密对象指针;其中,空闲加密对象指针由对应的加密对象指针持有管理器进行管理;加解密装置包括:
40.第一确定模块,用于在第一线程调用空闲加密对象指针时,加密对象指针控制管理器遍历第一空闲加密对象指针链表,确定是否存在第一目标空闲加密对象指针;其中,第一空闲加密对象指针链表属于第一线程对应的第一空闲加密对象指针池;若是,第一线程调用第一目标空闲加密对象指针;
41.第二确定模块,用于加密对象指针控制管理器从第二加密对象指针链表中确定是否存在第二目标空闲加密对象指针;其中,第二加密对象指针链表包括所有空闲加密对象指针池和所有空闲加密对象指针;第二目标空闲加密对象指针属于第二线程对应的第二空闲加密对象指针池;
42.加密对象指针绑定模块,用于第一线程通过加密对象指针控制管理器将第二目标空闲加密对象指针与第二线程解绑,第一线程绑定并调用第二目标空闲加密对象指针;
43.加密对象指针新建模块,用于第一线程新建目标加密对象指针;
44.数据加解密处理模块,用于第一线程使用第一目标空闲加密对象指针、第二目标空闲加密对象指针和目标加密对象指针中的其中一种,进行数据的加密处理或解密处理。
45.基于前述技术方案相同的发明构思,本发明还提供了一种可读存储介质,其上存储有计算机程序,计算机程序在被处理器执行时实现前述技术方案中的任一项方法的步骤。
46.基于前述技术方案相同的发明构思,本发明还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现前述技术方案中的任一项方法的步骤。
47.通过本发明的一个或者多个技术方案,本发明具有以下有益效果或者优点:
48.本发明提供了一种程序的安全加密解密方法,在第一线程需要使用加密对象指针时,首先从第一线程对应的空闲加密对象指针池中寻找第一目标空闲加密对象指针,若没有第一目标空闲加密对象指针则从第二线程对应的空闲加密对象指针池中寻找第二目标空闲加密对象指针,并将其从第二线程摘除到第一线程中使用。上述的方案实现了在单线程内复用空闲加密对象指针,或在多线程之间调配空闲加密对象指针并进行复用,避免了加密对象指针的大量重复创建,显著提高了加密对象指针的应用效率,并节省了系统计算资源。
49.上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
50.通过阅读下文优选实施方式的详细描述,各种其他的优点和益处对于本领域普通技术人员将变得清楚明了。附图仅用于示出优选实施方式的目的,而并不认为是对本发明的限制。而且在整个附图中,用相同的参考符号表示相同的部件。在附图中:
51.图1示出了根据本发明一个实施例的程序的加密解密方法流程示意图;
52.图2示出了根据本发明一个实施例的程序的加密解密装置示意图。
具体实施方式
53.为了使本技术所属技术领域中的技术人员更清楚地理解本技术,下面结合附图,通过具体实施例对本技术技术方案作详细描述。
54.为了解决每个加解密线程在每次调用加解密算法时都会创建新的加密对象指针,从而出现重复创建多个相同类型的加密对象指针的情况,大量加密对象指针占用过多的系统资源问题,在一个可选的实施例中,提出了一种多线程之间复用加密对象指针的方法,其整体思路如下:
55.一种程序的加密解密方法,所述程序包括一个以上的线程,所述线程用于实施加密处理或解密处理;一个线程对应一个空闲加密对象指针池;一个空闲加密对象指针池中包括一个以上的空闲加密对象指针;其中,空闲加密对象指针由对应的加密对象指针持有管理器进行管理;
56.如附图1所示,程序的加密解密方法具体包括如下步骤:
57.s1:在第一线程调用空闲加密对象指针时,加密对象指针控制管理器遍历第一空闲加密对象指针链表,确定是否存在第一目标空闲加密对象指针;其中,第一空闲加密对象指针链表属于第一线程对应的第一空闲加密对象指针池;
58.s2:若存在第一目标空闲加密对象指针,第一线程调用第一目标空闲加密对象指针;
59.s3:若不存在第一目标空闲加密对象指针,加密对象指针控制管理器从第二加密对象指针链表中确定是否存在第二目标空闲加密对象指针;其中,第二加密对象指针链表包括所有空闲加密对象指针池和所有空闲加密对象指针;第二目标空闲加密对象指针属于第二线程对应的第二空闲加密对象指针池;
60.s4:若存在第二目标空闲加密对象指针,第一线程通过加密对象指针控制管理器将第二目标空闲加密对象指针与第二线程解绑,第一线程绑定并调用第二目标空闲加密对象指针;
61.s5:若不存在第二目标空闲加密对象指针,第一线程新建目标加密对象指针;
62.s6:第一线程使用第一目标空闲加密对象指针、第二目标空闲加密对象指针和目标加密对象指针中的其中一种,进行数据的加密处理或解密处理。
63.总体来讲,在本实施例中,程序下的每一个要使用加密对象指针的功能逻辑都设计有一个独立的线程以完成加密对象指针的功能调用。对于每个独立的加解密线程,设计了与其对应的空闲加密对象指针池,空闲加密对象指针池中存储可复用的空闲加密对象指针,每一个空闲加密对象指针由对应的加密对象指针持有管理器进行管理;当第一线程在调用加密算法时,首先可以从自身对应的空闲加密对象指针池中寻找可用的空闲加密对象指针,若自己的空闲加密对象指针池中没有可用的空闲加密对象指针,则设计了加密对象指针控制管理器,从第二线程对应的空闲加密对象指针池中寻找和调用可用的空闲加密对象指针。其中,加密对象指针控制管理器为全局管理,整个程序中只有一个,所有线程共享其功能;第一线程是当前需要使用加密对象指针的功能线程,而第二线程是目前拥有第一线程可用的加密对象指针,而此时该加密对象指针处于空闲状态的功能线程。若要实现将原本绑定到第二线程的空闲加密对象指针调配给第一线程使用,则需要将第二线程中的可用空闲加密对象指针摘除到第一线程中,在程序在多任务实际运行时此过程中将涉及大量加密对象指针的合理管理和调度,以节省计算资源占用的同时避免产生逻辑混乱。故而,本实施例提供了一种在单线程内复用空闲加密对象指针,或在多线程之间进行空闲加密对象指针的高效率调配和复用的方案,以达到减少加密对象指针的大量重复创建,提高加密对象指针应用效率,节省系统计算资源的目的。
64.结合一个应用场景对上述方案达到的效果进行通俗的说明:(1)某时刻下程序中的某功能线程a创建了一个加密对象指针a,a在其生命周期中可以被复用,在当前时刻下a正在被线程a使用;(2)此时,其他功能线程b需要使用加解密算法,a是可用的加密对象指针,但由于此时a正在被线程a使用,那么线程b其也会创建一个加密对象指针b,在线程b完成加解密操作后,加解密对象指针b则处于空闲状态,此时b即为上述技术方案中的空闲加密对象指针;(3)接着,另一个功能线程c也需要需要使用加解密算法,那么线程c此时则可以去使用功能b创建的加密对象指针b,而不需要再创建一个新的加密对象指针c。
65.在另一种应用场景下,程序中的某独立线程a此刻正在使用一个加密对象指针,此时线程a其他的功能还需要使用加密对象指针,由于之前创建的加密对象指针正在被使用并没有空闲,那么此时线程a则会再创建一份加密对象指针,可以得知,在程序实现功能的过程中,一个线程则会创建多个加密对象指针,这些加密对象指针在空闲后,其加密对象指针持有管理器判断该加密对象指针满足复用条件,即第一预设条件,则将其存储至空闲加密对象指针池中,以供线程a在之后的时间内进行复用,或者供其他线程,如线程b复用。
66.在下文中,对上述方法的可选实现方式进行详细的说明:
67.为了实现s1~s5的步骤,需要先设计空闲加密对象指针、加密对象指针持有管理器、空闲加密对象指针池和加密对象指针控制管理器的定义和功能。在本实施例中,每一个需要调用加密解密算法的独立线程都对应有一个空闲加密对象指针池,用于存放所述线程
使用的一个以上的空闲加密对象指针。由于加密对象指针在使用时对数据进行加解密,如果在使用过程中强行阻止则会导致数据没有加解密完成而产生无效数据,同时一个加解密的对象指针是不能同时被多个线程使用的(由于其涉及到数据的管理和局部变量临时变量的限制)。因此可选的,空闲加密对象指针池中的空闲加密对象指针满足第一预设条件,第一预设条件即为空闲加密对象指针可放入空闲加密对象指针池中进行复用的基本条件,第一预设条件包括:空闲加密对象指针的使用时间在预设时间以内;且空闲加密对象指针没有被关闭;且空闲加密对象指针可复用;
68.空闲加密对象指针由对应的加密对象指针持有管理器进行管理,具体包括:加密对象指针持有管理器判断空闲加密对象指针是否满足第一预设条件;若是,加密对象指针持有管理器将空闲加密对象指针存储至空闲加密对象指针池;其中,空闲加密对象指针池对应于空闲加密对象指针当前绑定的线程;若否,关闭空闲加密对象指针。上述方案设计了一个能够被复用的加密对象指针的基础功能,在空闲加密对象指针池中存储的,需要被复用的空闲加密对象指针则必须实现上述基本功能。基于此,本实施例中涉及的定义如下:
69.1、定义空闲加密对象指针;
70.创建空闲加密对象指针的类:class encryptpointer,在本实施例中使用一个类encryptpointer来封装其必须提供的功能。判断满足复用条件(即第一预设条件)的空闲加密对象指针必须具体如下的核心接口:
71.virtual bool isageout()=0;加密对象指针超时判断接口,用于判断加密对象指针在当前是否超过预设时间,加密对象指针在使用过程中根据加密对象指针的使用时间(或生命周期)是否超过预设时间来判断是否超时,超时的加密对象指针不能被复用;可选的,预设时间可以是3分钟~10分钟,优选为5分钟,6分钟等;例如,预设时间设为5分钟,即一个加密对象指针的生命周期为5分钟,那么超过5分钟此加密对象指针属于超时情况不能被复用。超时的加密对象指针不能被复用,是由于加密对象指针再使用一段时间后其会占用大量内存,在内存中残留了密钥数据或者是零时数据,会使操作信息出现安全隐患,因此每个对象指针是应当具有一定的生命周期,其使用时间超过生命周期后则不能再使用;而没有超过生命周期的加密对象指针可以进行复用,从而在减少创建加密对象指针的性能开销的同时保证了加密数据的安全。
72.virtual bool isclose()=0;加密对象指针关闭判断接口,用于判断加密对象指针是否关闭,关闭了不能被复用。例如,一些加密对象指针会在使用完成、或超时后进行关闭。
73.virtual bool isreuse()=0;加密对象指针复用判断接口,用于判断加密对象指针是否可以被复用,即继续使用,例如有的加密对象指针已经使用完成了,其刚开始时可以被复用,但是随着使用过程可能后续不能被继续使用了。
74.virtual void detach()=0;加密对象指针解绑接口,由于加密对象指针涉及到数据的加解密,所以不能够在加解密过程中强行将其断开,所以必须等待其执行完成后才能够进行解开。即,加密对象指针必须是空闲的才能支持复用,不能强行复用正在使用的加密对象指针
75.virtual void atach()=0;加密对象指针绑定接口,当摘除了加密对象指针后,将其附加到新的线程中。
76.2、定义加密对象指针持有管理器
77.在定义了空闲加密对象指针的功能和接口后,对应的,需要设计加密对象指针持有管理器encryptpointerholder,用于对加密对象指针的生命周期是否空闲以及是否超时等功能进行管理和封装。
78.创建类:class encryptpointerholder,以管理加密对象指针的生命周期,一个对象加密指针(encryptpointer)对应一个持有管理器(holder),用于判断当前加密对象指针是否能够复用并将其存储至空闲加密对象指针池中。加密对象指针持有管理器必须具备以下的接口,以实现对加密对象指针的管理:
79.encryptpointerholder(reuseencryptpointer*pep){m_pep=pep;}:其中构造函数必须提供一个加密对象指针的对象实例,在本实施例中则将其存储到成员变量m_pep中。
80.bool isageout():超时判断接口,用于判断加密对象指针的使用时间是否已经超过了预设时间(或生命周期),如果超过生命周期,则加密对象指针不能再被复用;retrun pep->isageout();}
81.encryptpointer*getencryptpointer(){return m_pep;}:返回存储的加密对象指针。
82.static bool ispoolable(encryptpointer*pep);复用判断接口,用于判断加密对象指针是否可以放入到加密对象指针池中进行复用。此方法是一个静态方法可以对任意加密对象指针进行判断。
83.return pep->isclose()&&pep->isreuse();
84.通过调用加密对象指针的是否已经关闭isclose以及是否可以复用isreuse接口来判断加密对象指针是否可以放入加密对象指针池。
85.void close();加密对象指针关闭接口,用于关闭加密对象指针;当需要关闭某加密对象指针时,调用其接口来关闭m_pep->close()。
86.3、定义空闲加密对象指针池;
87.另一方面,需要设计空闲加密对象指针池encryptpointerpool,用于存放多个空闲加密对象指针,从而将多个空闲加密对象指针存放起来,同时管理所有空闲加密对象指针,从而尽可能的提高其复用性。空闲加密对象指针池的设计具体如下:
88.(1)定义类:设计类class encryptpointerpool,以管理整个加密对象指针池中的所有空闲加密对象指针;
89.其成员属性包括:
90.std::list<encryptpointerpoolholder*>idleencryptpointerlist,即空闲加密对象指针链表。
91.encryptpointerpoolcontrol*pc;
92.(2)构造函数。
93.explicit encryptpointerpool(encryptpointerpoolcontrol*pc);其中,参数encryptpointerpoolcontrol是加密对象指针控制管理器的指针。整个程序中只有一个encryptpointerpoolcontrol控制器的实例,所有的线程进行共享此实例,所以我们encryptpointerpoolcontrol是可以多线程同时调用的。
94.mpc=pc;将其保存到成员变量mpc中。
95.空闲加密对象指针池应当包含以下的核心功能接口:
96.①
存储空闲加密对象指针接口:void putencryptpointer(encryptpointer*ep);此接口是将一个满足第一预设条件的空闲加密对象指针存储到加密对象指针池中。
97.具体的,在存储之前首先判断此加密对象指针是否可以复用:
98.if(!encryptpointerholder::ispoolable(ep))return;如果此加密对象指针不能够复用则退出不进行存储;否则创建一个encryptpointerholder来管理此加密对象指针。
99.encryptpointerholder*holder=new encryptpointerholder(ep);为此加密对象指针创建一个新的encryptpointerholder;
100.idleencryptpointerlist.push_back(holder);存储到空闲列表中;
101.②
获取空闲加密对象指针接口:encryptpointer*getidleencryptpointer();此接口是从空闲加密对象指针池中获取一个空闲加密对象指针;
102.4、定义加密对象指针控制管理器;
103.在定义了空闲加密对象指针、空闲加密对象指针持有管理器和空闲加密对象指针池以后,为了实现空闲加密对象指针在各个线程中进行调用,需要设计一个支持多线程访问的加密对象指针控制管理器,此控制器主要用于调度当前程序全局的空闲加密对象指针并提高每个空闲加密对象指针池中的空闲加密对象指针的调度效率和应用效率。空闲加密对象指针控制管理器的定义和接口如下:
104.(1)构造类;
105.在本实施例中设计一个类class encryptpointerpoolcontrol,用于封装控制器的功能,控制器的成员属性包括:
106.std::list<encryptpointerinfo>epbyage;全局空闲加密对象指针链表,用于存储全部的空闲加密对象指针和其对应的空闲加密对象指针池;其中,所有的空闲加密对象指针在链表中按空闲时间递减的方式进行排列;
107.其中的encryptpointerinfo包括空闲加密对象指针的指针和其对应的空闲加密对象指针池的指针。其定义如下:
108.struct encryptpointerinfo{encryptpointer*pep;encryptpointerpool*ppool;}具有2个迭代器指针。
109.unordered_map<const encryptpointer*,listiter>epmap;
110.在本实施例中,使用了stl标准容器的不排序的unordered_map容器,由于unordered_map容器不会对数据进行排序,因此具有更高的数据处理效率,此处在map容器中存储的键值是加密对象指针的指针,其值为链表epbyage的一个迭代器,这种方式可以加速加密对象指针控制管理器访问epbyage链表,提高数据访问的效率。
111.std::mutex lock;多线程锁,用于对epbyage变量加锁,防止多线程同时操作造成混乱。
112.(2)定义存储空闲加密对象指针接口;
113.void addidleencryptpointer(encryptpointer*ep,encryptpointerpool*pool);此接口用于存储空闲加密对象指针和其对应的空闲加密对象指针池对象。
114.std::lock_guard<std::mutex>lock(lock);多线程锁保护,为了防止多线程同时
访问一个空闲加密对象指针,此处采用加锁互斥多个线程的同时访问。
115.if(epmap.find(ep)!=epmap.end()){return;};在存储空闲加密对象指针之前,先查询链表中是否已经存储了此空闲加密对象指针,如果已经存储则不能存储相同的加密对象指针。即相同的空闲加密对象指针在所有线程对应的空闲加密对象指针池中只能存储一份。
116.listiter newit=epbyage.insert(epbyage.end(),{ep,pool});
117.在存储空闲加密对象指针时,将其插入到了链表epbyage中的空闲加密对象指针队列的最尾端,即,存储的空闲加密对象指针是按照其空闲的时刻列表,按照空闲时间递减的顺序进行排列,也就是最先空闲的加密对象指针在队列的最前面。这样可以保障最先空闲的加密对象指针最先被复用。epmap[ep]=newit;同时该空闲加密对象指针的指针存储到epmap中。
[0118]
(3)定义获取空闲加密对象指针接口;
[0119]
encryptpointer*getidleencryptpointere();编写一个获取空闲加密对象指针的接口。
[0120]
在定义了空闲加密对象指针、加密对象指针持有管理器和空闲加密对象指针池的类和接口以后,接下来进行具体实施:
[0121]
对于步骤s1,具体的,当某线程需要使用加密对象指针调用加解密算法时,首先从该线程对应的空闲加密对象指针池中寻找可用的空闲加密对象指针,其中,第一空闲加密对象指针链表即对应当前空闲加密对象指针池下的std:list链表,可选的,第一目标空闲加密对象指针应当满足第二预设条件,即空闲加密对象指针可用于第一线程需满足的条件,第二预设条件包括:第一目标空闲加密对象指针或第二标空闲加密对象指针的类型与线程需求的加密对象指针的类型相同。若在该线程自己的空闲加密对象指针池中找到了可用的空闲加密对象指针,则直接调用其实施加密或解密操作。若否,则从其它线程的空闲加密对象指针池中进行查找。
[0122]
基于上述思路,对于步骤s1,一种可选的从第一加密对象指针链表中确定是否存在第一目标空闲加密对象指针的方案如下:
[0123]
s11:加密对象指针控制管理器遍历第一空闲加密对象指针链表,判断第一空闲加密对象指针链表是否为空;若第一空闲加密对象指针链表非空,从第一空闲加密对象指针链表中取出第一空闲加密对象指针对应的第一空闲加密对象指针持有管理器;其中,在第一空闲加密对象指针链表中的符合第二预设条件的全部空闲加密对象指针队列里,第一空闲加密对象指针具有最长的空闲时间;
[0124]
s12:判断第一空闲加密对象指针持有管理器管理的第一空闲加密对象指针在当前时刻下的使用时间是否超时;若第一空闲加密对象指针未超时,将第一空闲加密对象指针确定为第一目标空闲加密对象指针;若第一空闲加密对象指针超时,第一空闲加密对象指针持有管理器先关闭第一空闲加密对象指针,加密对象指针控制管理器再取出第二空闲加密对象指针对应的第二空闲加密对象指针持有管理器;其中,在第一空闲加密对象指针链表中的符合第二预设条件且未关闭的空闲加密对象指针队列里,第二空闲加密对象指针具有最长的空闲时间且在当前时刻下使用时间未超时;
[0125]
s13:将第二空闲加密对象指针确定为第一目标空闲加密对象指针。
[0126]
一种上述方法的具体实现过程如下:
[0127]
遍历std:list<encryptpointerpoolholder*>idleencryptpointerlist链表,从头到尾,找到一个可用的空闲加密对象指针,具体包括:
[0128]
while(!idleencryptpointerlist.empty()):首先采用while循环遍历,判断链表是否为空(是否存储有空闲加密对象指针);
[0129]
holder=&idleencryptpointerlist.front():若链表不为空,从链表中的空闲加密对象指针队列中取出符合第二预设条件的第一个加密对象指针持有管理器encryptpointerholder;其中,链表中空闲加密对象指针队列是按照空闲时间递减的方式进行排列,空闲时间最长的指针在队头,最短的指针在队尾;因此,排在空闲加密对象指针队列队列中第一个加密对象指针,即为空闲时间最长的空闲加密对象指针;
[0130]
if(holder->isageout()):在使用该空闲加密对象指针前,加密对象指针管理器需要判断此空闲加密对象指针在当前时刻下是否已经超时,若超时则不可以再复用,因为超时的加密对象指针会产生安全隐患,加密对象指针管理器随即关闭加密对象指针holder->close();continue;并继续在队列中寻找下一个可用的空闲对象指针;在寻找过程中,符合第一线程需求类型但已经超时的空闲加密对象指针均会被关闭;
[0131]
return holder->getencryptpointer():找到一个符合第二预设条件的(即可用的)、未超时的空闲时间最长的空闲加密对象指针。
[0132]
若遍历链表后,并没有找到同时满足第二预设条件且使用时间未超时的空闲加密对象指针时,加密对象指针控制管理器将从其它线程下的空闲加密对象指针池中寻找可用的空闲加密对象指针,一种可选的方案如下:
[0133]
可选的,对于s3,一种可选的从第二空闲加密对象指针链表中确定是否存在第二目标空闲加密对象指针的方案如下:
[0134]
s31:加密对象指针控制管理器判断第二空闲加密对象指针链表是否为空;
[0135]
s32:若第二空闲加密对象指针链表非空,从第二空闲加密对象指针链表中确认符合第二预设条件的第三空闲加密对象指针;其中,在第二空闲加密对象指针链表中的符合第二预设条件的全部空闲加密对象指针队列里,第三空闲加密对象指针具有最长的空闲时间;
[0136]
s33:判断第三空闲加密对象指针在当前时刻的使用时间是否超时;
[0137]
s331:若第三空闲加密对象指针未超时,将第三空闲加密对象指针确认为第二目标空闲加密对象指针;
[0138]
s332:若第三空闲加密对象指针超时,先关闭第三空闲加密对象指针,再将第四空闲加密对象指针确认为第二目标空闲加密对象指针;其中,在第二空闲加密对象指针链表中的符合第二预设条件且未关闭的空闲加密对象指针队列里,第四空闲加密对象指针具有最长的空闲时间且在当前时刻下未超时。
[0139]
具体的,第二空闲加密对象指针链表对应于上文中的全局空闲加密对象指针链表:std::list<encryptpointerinfo>epbyage。可选的,全局链表中的所有空闲加密对象指针队列同样按照空闲时间的递减顺序进行排列。
[0140]
一种上述方法可选的具体实施过程如下:
[0141]
首先从epbyage全局链表中找到满足第一预设条件的可用空闲加密对象指针,由
于全局链表中的空闲加密对象指针队列是按照空闲时间递减顺序排列的,因此先从队列的队头找起。
[0142]
判断epbyage全局链表是否非空:if(epbyage.empty()){return null;若是,说明epbyage中没有空闲加密对象指针,返回空值,表明当前没有空闲的加密对象指针可供线程使用,此时第一线程将创建新的加密对象指针。
[0143]
若否,此时epbyage链表非空,说明存在当前线程可用的空闲加密对象指针,则:encryptpointerpool*pool=*epbyage.begin();如前所述,排在队列最前面的空闲加密对象指针是最先空闲的,应当尽量使用最先空闲的加密对象指针,从而避免空闲加密对象指针出现超时。同样的,再调用此空闲加密对象指针时限判断当前时刻下其使用时间是否超过预设时间(是否超时),如果超时则继续查找下一个可用的空闲加密对象指针,因为epbyage链表是按照其加入的顺序进行存放。
[0144]
当从epbyage全局链表中找出一个可用的第二目标空闲加密对象指针时,同时也确定了其所处的空闲加密对象指针池和对应的线程,此时该线程即为上述过程中的第二线程。利用pool->getidleencryptpointer();即调用之前编写的加密对象指针池的接口getidleencryptpointer来获取第二目标空闲加密对象指针。
[0145]
在前述的过程中,当确定出空闲时间最长的可用空闲加密对象指针已经超时了,则需要将其关闭,并将其从第二加密对象指针链表中删除,以避免超时的加密对象指针带来的资源占用问题和信息安全隐患问题。为了提高全局空闲加密对象指针的删除效率,可选的,加密对象指针控制管理器包括无序的关联式映射map容器,关联式映射map容器中存储第二空闲加密对象指针链表中所有的空闲加密对象指针的指针,空闲加密对象指针的指针属于迭代器;
[0146]
在关闭第三空闲加密对象指针之后,还包括:
[0147]
将第三空闲加密对象指针从第二空闲加密对象指针链表中移除;将第三目标空闲加密对象指针的指针从关联式映射map容器中移除。上述方法的一种可选的具体实施过程如下:epbyage.erase(v.begin());从空闲加密对象指针移除掉队头超时的空闲加密对象指针;接着,epmap.erase(ret.second);从epmap中移除对应的空闲加密对象指针的指针,此处直接使用了其迭代器ret.second,从而避免了从epmap去遍历查找,提高了整个删除的效率。因为若存储指针则需要遍历epmap以执行一一匹配,而若存储其迭代器指针,则可以直接进行删除,从而提高了删除的效率,减少了计算资源的占用。在后续的寻找过程中,epbyage链表中所有符合第二预设条件,但已经超时的空闲加密对象指针均要关闭且从epbyage和epmap中删除。
[0148]
若判断出整个epbyage链表中均无同时满足第二预设条件和未超时的可用空闲加密对象指针(即第三和第四空闲加密对象指针均不存在),说明此时所有线程中均没有满足条件的可复用的空闲加密对象线程,此时,第一线程创建新的加密对象指针,以进行数据的加密处理或解密处理。
[0149]
当第一线程从第二线程对应的空闲加密对象指针池中确定出可用的目标空闲加密对象指针后,接下来是将目标空闲加密对象指针与第二进程解绑(detach),然后将其与第一进程绑定(attach)。可以通过投递摘除函数进行处理,具体如下:
[0150]
可选的,s4:第一线程通过加密对象指针控制管理器将第二目标空闲加密对象指
针与第二线程解绑,具体包括:
[0151]
s41:第一线程通过加密对象指针控制管理器向第二线程投递摘除函数,以使第二线程与第二目标空闲加密对象指针解绑;
[0152]
s42:在第二线程与第二目标空闲加密对象指针解绑后,第二线程向第一线程投递摘除信号量;
[0153]
s43:第一线程绑定第二目标空闲加密对象指针,具体包括:
[0154]
s44:第一线程根据摘除信号量,进行第二目标空闲加密对象指针的绑定。具体的,由于同一个加解密的对象指针是不能同时被多个线程使用的,因此,在空闲加密对象指针能够在多个线程之间进行复用时,其操作为将其从第二线程摘除到第一线程中。同时,每个独立的线程也必须具备一个接收摘除函数接口,以接收摘除功能。
[0155]
基于此,在线程中设计了一个独立的接收函数功能的接口:void recvfunction(std::function<void()>func),用于接收本线程外的功能函数,同时func的执行是在本线程来执行。那么摘除操作即为摘除的线程(如第一线程)投递一个摘除的功能函数到被摘除的线程(如第二线程)中,被摘除的线程则将一个空闲加密对象指针从本线程和本线程对应的空闲加密对象指针池中进行摘除,如此,目标空闲加密对象指针一旦被摘除并与被摘除的线程(第二线程)进行detach,从而摘除线程(第一线程)就可以对目标空闲加密对象指针进行后续的复用了;此处用func()执行该功能;当第二线程中的一个目标空闲加密对象指针被摘除后,调用attach到第一线程,并与第一线程进行绑定操作。
[0156]
此处使用std::function做为参数,则可以接收其他的功能,不仅仅局限于投递摘除操作,例如第一线程还可以投递一个查询第二线程在当前时刻的空闲加密对象指针的数目,如果其它线程想获取第二线程的空闲加密对象指针的数目时,都只能采取上述投递操作。
[0157]
同时多个线程在摘除过程中,由于被摘除的线程可能处于执行逻辑中,所以需要使用线程的同步异步来同步被调用的线程,即摘除线程通过线程的信号量来确认被摘除线程的摘除功能是否执行完成,被摘除线程执行完投递的任务后触发该信号量来通知摘除线程摘除功能完成。
[0158]
综上所述,一种可选的空闲加密对象指针复用方法的整体过程如下:
[0159]
每个使用加密对象指针的功能都启用一个独立线程进行操作,如此不会影响整个程序的功能,由于加密对象指针的创建会消耗大量计算资源,所以启用独立的线程不会导致整个程序顿卡。
[0160]
(1)创建一个全局的加密对象指针控制管理器encryptpointerpoolcontrol poolctr;用于管控全局的空闲加密对象指针,整个程序中只有一个控制管理器,其被多个线程共享的。
[0161]
(2)对于每一个要使用加密对象指针的功能逻辑,均创建一个独立的线程来完成加密对象指针的功能调用。例如对于功能b,创建一个线程std::thread来执行b的功能。
[0162]
std::thread t([&]{
[0163]
首先在b的线程中创建一个空闲加密对象指针池,用于存储与b线程相关的全部空闲加密对象指针。
[0164]
encryptpointerpool pool(&poolctr);空闲加密对象指针池中需要传入创建的
加密对象指针控制管理器的对象指针。
[0165]
当其需要访问加密对象指针的功能时,则需要获取加密对象指针。
[0166]
那么首先则会从线程b的空闲加密对象指针池pool中查找是否有空闲的加密对象指针。
[0167]
if(pool.getidleencryptpointer()==null){如果自己的加密对象指针池中没有空闲加密对象指针,那么则从其他线程的加密对象指针池中查看是否空闲加密对象指针;
[0168]
poolctr->getidleencryptpointer();此时加密对象指针控制管理器会从所有的加密对象指针池查看是否有空闲的加密对象指针,如果有则调度到本加密对象指针池来进行复用;
[0169]
}else{
[0170]
如果自己的空闲池中有空闲的加密对象指针则直接返回给其进行使用。
[0171]
return pool.getidleencryptpointer();}
[0172]
})
[0173]
本实施例提供了一种程序的安全加密解密方法,在第一线程需要使用加密对象指针时,首先从第一线程对应的空闲加密对象指针池中寻找第一目标空闲加密对象指针,若没有第一目标空闲加密对象指针则从第二线程对应的空闲加密对象指针池中寻找第二目标空闲加密对象指针。上述的方案实现了在单线程内复用(重复利用)空闲加密对象指针,或在多线程之间调配(或共享)空闲加密对象指针并进行复用,避免了加密对象指针的大量重复创建,显著提高了加密对象指针的应用效率,并节省了系统计算资源;同时,在调用空闲加密对象指针之前验证其使用时间是否超过预设的生命周期,若超时了则关闭空闲加密对象指针不再复用,从而在减少创建加密对象指针的性能开销的同时保证了加密数据的安全;
[0174]
另一方面,在加密对象指针控制管理器在多线程之间调用空闲加密对象指针时,为了提高数据处理效率,使用stl标准容器中的不排序map容器存储全局空闲加密对象指针的指针,且值为全局空闲加密对象指针链表的一个迭代器,如此可以加快访问全局空闲加密对象指针链表的速度,提高数据访问的效率。
[0175]
基于前述实施例相同的发明构思,在另一个可选的实施例中,公开了一种程序的安全加密解密装置,程序包括一个以上的线程,线程用于实施加密处理或解密处理;一个线程对应一个空闲加密对象指针池;一个空闲加密对象指针池中包括一个以上的空闲加密对象指针;其中,空闲加密对象指针由对应的加密对象指针持有管理器进行管理;
[0176]
如附图2所示,装置包括:
[0177]
第一确定模块10,用于在第一线程调用空闲加密对象指针时,加密对象指针控制管理器遍历第一空闲加密对象指针链表,确定是否存在第一目标空闲加密对象指针;其中,第一空闲加密对象指针链表属于第一线程对应的第一空闲加密对象指针池;若是,第一线程调用第一目标空闲加密对象指针;
[0178]
第二确定模块20,用于加密对象指针控制管理器从第二加密对象指针链表中确定是否存在第二目标空闲加密对象指针;其中,第二加密对象指针链表包括所有空闲加密对象指针池和所有空闲加密对象指针;第二目标空闲加密对象指针属于第二线程对应的第二
空闲加密对象指针池;
[0179]
加密对象指针绑定模块30,用于第一线程通过加密对象指针控制管理器将第二目标空闲加密对象指针与第二线程解绑,第一线程绑定并调用第二目标空闲加密对象指针;
[0180]
加密对象指针新建模块40,用于第一线程新建目标加密对象指针;
[0181]
数据加解密处理模块50,用于第一线程使用第一目标空闲加密对象指针、第二目标空闲加密对象指针和目标加密对象指针中的其中一种,进行数据的加密处理或解密处理。
[0182]
基于前述实施例相同的发明构思,在另一个可选的实施例中,提供了一种可读存储介质,其上存储有计算机程序,计算机程序在被处理器执行时实现前述实施例中任一项方法的步骤。
[0183]
基于前述实施例相同的发明构思,在另一个可选的实施例中,提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行程序时实现前述实施例中任一项方法的步骤。通过本发明的一个或者多个实施例,本发明具有以下有益效果或者优点:
[0184]
本发明提供了一种程序的安全加密解密方法,在第一线程需要使用加密对象指针时,首先从第一线程对应的空闲加密对象指针池中寻找第一目标空闲加密对象指针,若没有第一目标空闲加密对象指针则从第二线程对应的空闲加密对象指针池中寻找第二目标空闲加密对象指针,并将其从第二线程摘除到第一线程中使用。上述的方案实现了在单线程内复用空闲加密对象指针,或在多线程之间调配空闲加密对象指针并进行复用,避免了加密对象指针的大量重复创建,显著提高了加密对象指针的应用效率,并节省了系统计算资源。
[0185]
尽管已描述了本技术的优选实施例,但本领域内的普通技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本技术范围的所有变更和修改。
[0186]
显然,本领域的技术人员可以对本技术进行各种改动和变型而不脱离本技术的精神和范围。这样,倘若本技术的这些修改和变型属于本技术权利要求及其等同技术的范围之内,则本技术也意图包含这些改动和变型在内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1