用于内存完整性保护的方法和内存控制器转让专利

申请号 : CN202110384123.X

文献号 : CN113111391B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 秦承刚夏虞斌杜东冯二虎何征宇徐权安伟

申请人 : 支付宝(杭州)信息技术有限公司

摘要 :

本说明书的实施例提供了用于内存完整性保护的方法和内存控制器。该方法由可信片上系统的内存控制器执行,该方法包括:接收可信片上系统的处理器对可信内存的访问请求,其中:可信内存被划分为N个区域,N个区域分别与用于完整性保护的N棵完整性保护树相对应,每棵完整性保护树至少包括根节点和多个叶子节点,每个叶子节点具有针对相应区域中的至少一个数据块的版本值,根节点具有基于多个叶子节点而得到的版本值;访问请求包括要访问的目标内存地址;在N棵完整性保护树中确定与目标内存地址对应的目标完整性保护树;基于目标完整性保护树,针对目标内存地址进行完整性验证。

权利要求 :

1.一种用于内存完整性保护的方法,其中,所述方法由可信片上系统的内存控制器执行,所述方法包括:接收所述可信片上系统的处理器对可信内存的访问请求,其中:

所述可信内存被划分为N个区域,所述N个区域分别与用于完整性保护的N棵完整性保护树相对应,N为大于1的正整数,每棵完整性保护树至少包括根节点和多个叶子节点,每个叶子节点具有针对相应区域中的至少一个数据块的版本值,所述根节点具有基于所述多个叶子节点而得到的版本值;

所述内存控制器至少缓存所述N棵完整性保护树中的部分完整性保护树的根节点,所述N棵完整性保护树的根节点形成森林根树的叶子节点,所述森林根树的根节点是基于所述森林根树的叶子节点得到的,所述森林根树的根节点常驻在所述内存控制器中;

所述访问请求包括要访问的目标内存地址;

在所述N棵完整性保护树中确定与所述目标内存地址对应的目标完整性保护树;

基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。

2.根据权利要求1所述的方法,其中,所述内存控制器至少缓存有所述N棵完整性保护树各自的根节点。

3.根据权利要求1所述的方法,其中,所述内存控制器至少缓存有所述N棵完整性保护树中的M棵完整性保护树的根节点,所述M棵完整性保护树各自对应的区域在从当前时间往前的预定时段内被所述处理器访问过,M为小于N的正整数。

4.根据权利要求3所述的方法,其中,基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证,包括:如果所述内存控制器缓存有所述目标完整性保护树的根节点,则基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。

5.根据权利要求3所述的方法,其中,所述N棵完整性保护树被存储在所述可信片上系统之外的非可信存储空间中;

基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证,包括:如果所述内存控制器未缓存有所述目标完整性保护树的根节点,则基于所述森林根树的根节点以及所述N棵完整性保护树的根节点,对所述目标完整性保护树的根节点进行完整性验证;

如果对所述目标完整性保护树的根节点的完整性验证通过,则从所述非可信存储空间读取所述目标完整性保护树的根节点,并且将所述目标完整性保护树的根节点缓存在所述内存控制器中;

基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。

6.根据权利要求5所述的方法,其中,将所述目标完整性保护树的根节点缓存在所述内存控制器中,包括:如果所述内存控制器的剩余存储空间不足以缓存所述目标完整性保护树的根节点,则从所述内存控制器中删除所述M棵完整性保护树中的一棵完整性保护树的根节点;

从所述非可信存储空间读取所述目标完整性保护树的根节点,并且将所述目标完整性保护树的根节点缓存在所述内存控制器中。

7.根据权利要求1至6中任一项所述的方法,其中,针对所述N棵完整性保护树中的任一完整性保护树:该完整性保护树还包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级包括多个中间节点,每个叶子节点和每个中间节点均包括哈希值和多个子节点,每个子节点表示一个版本值,并且叶子节点和中间节点包括相同数量的子节点;

在每个叶子节点中,每个子节点表示该完整性保护树对应的区域中的一个数据块的版本值;

每个叶子节点的父节点为紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,紧接在根节点之下的中间层级的每个中间节点的父节点为该根节点,其余中间层级的中间节点的父节点为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;

对于每个中间节点或每个叶子节点,其任一子节点的版本值的更新使得其父节点的版本值更新;

对于每个中间节点或每个叶子节点,其哈希值是基于其所有子节点的版本值和其父节点的版本值得到的。

8.根据权利要求1至6中任一项所述的方法,其中,针对所述N棵完整性保护树中的任一完整性保护树,该完整性保护树还包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级包括多个中间节点;

每个中间节点至少包括哈希值和多个子节点;

每个叶子节点包括全局版本值、哈希值以及多个子节点;

处于同一层级的节点具有相同数量的子节点,并且叶子节点中的子节点数量不同于中间节点中的子节点数量;

在每个叶子节点中,每个子节点表示该完整性保护树对应的区域中的一个数据块的局部版本值,该叶子节点中的全局版本值由该叶子节点中的所有子节点共享,子节点的长度小于全局版本值的长度;

在每个叶子节点中,每个子节点的局部版本值是基于相应数据块的更新而被更新的,其中,当任一局部版本值溢出而返回初始值时,全局版本值被更新;

每个叶子节点的父节点是紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,并且该叶子节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;

在每个叶子节点中,哈希值是至少基于其全局版本值、其父节点的版本值以及其所有子节点的局部版本值来得到的。

9.根据权利要求8所述的方法,其中,

对于所述至少一个中间层级而言,在叶子节点之上的K个中间层级中,每个中间节点包括全局版本值、哈希值和多个子节点,每个子节点表示一个局部版本值,该中间节点的全局版本值由该中间节点中的所有子节点共享,子节点的长度小于全局版本值的长度,并且当该中间节点的任一局部版本值溢出而返回初始值时,该中间节点的全局版本值被更新,K为正整数;

在每个叶子节点中,哈希值是基于其全局版本值、其父节点的版本值、其所有子节点的局部版本值、以及其父节点所属的中间节点的全局版本值来得到的;

紧接在根节点之下的中间层级的每个中间节点的父节点为该根节点,其余中间层级的中间节点的父节点为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;

对于任一中间节点而言:

如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值、其父节点的局部版本值和其父节点所属的节点的全局版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的局部版本值更新;

如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值和其父节点的版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;

如果该中间节点不具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的所有子节点的版本值和其父节点的版本值来得到的,并且该中间节点的任一子节点的版本值的更新使得其父节点的版本值更新。

10.根据权利要求9所述的方法,其中,在从根节点到叶子节点的方向上,除了根节点之外,每一层级的节点中的子节点数量少于在该层级之下的层级的节点中的子节点数量。

11.一种可信片上系统的内存控制器,包括:

接收单元,其接收所述可信片上系统的处理器对可信内存的访问请求,其中:所述可信内存被划分为N个区域,所述N个区域分别与用于完整性保护的N棵完整性保护树相对应,N为大于1的正整数,每棵完整性保护树至少包括根节点和多个叶子节点,每个叶子节点具有针对相应区域中的至少一个数据块的版本值,所述根节点具有基于所述多个叶子节点而得到的版本值;

所述内存控制器至少缓存所述N棵完整性保护树中的部分完整性保护树的根节点,所述N棵完整性保护树的根节点形成森林根树的叶子节点,所述森林根树的根节点是基于所述森林根树的叶子节点得到的,所述森林根树的根节点常驻在所述内存控制器中;

所述访问请求包括要访问的目标内存地址;

确定单元,其在所述N棵完整性保护树中确定与所述目标内存地址对应的目标完整性保护树;

验证单元,其基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。

12.根据权利要求11所述的内存控制器,还包括第一缓存单元,其至少缓存有所述N棵完整性保护树各自的根节点。

13.根据权利要求11所述的内存控制器,还包括第二缓存单元,其至少缓存有所述N棵完整性保护树中的M棵完整性保护树的根节点,所述M棵完整性保护树各自对应的区域在从当前时间往前的预定时段内被所述处理器访问过,M为小于N的正整数;所述森林根树的根节点常驻在所述第二缓存单元中。

14.根据权利要求13所述的内存控制器,其中,所述验证单元进一步进行以下操作:如果所述第二缓存单元缓存有所述目标完整性保护树的根节点,则基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。

15.根据权利要求13所述的内存控制器,其中,所述N棵完整性保护树被存储在所述可信片上系统之外的非可信存储空间中;

所述验证单元进一步进行以下操作:

如果所述第二缓存单元未缓存有所述目标完整性保护树的根节点,则基于所述森林根树的根节点以及所述N棵完整性保护树的根节点,对所述目标完整性保护树的根节点进行完整性验证;

所述第二缓存单元进一步进行以下操作:

如果对所述目标完整性保护树的根节点的完整性验证通过,则从所述非可信存储空间读取所述目标完整性保护树的根节点,并且对所述目标完整性保护树的根节点进行缓存;

所述验证单元进一步进行以下操作:

基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。

16.根据权利要求15所述的内存控制器,其中,所述第二缓存单元进一步进行以下操作:如果所述第二缓存单元的剩余存储空间不足以缓存所述目标完整性保护树的根节点,则从所述第二缓存单元中删除所述M棵完整性保护树中的一棵完整性保护树的根节点;

从所述非可信存储空间读取所述目标完整性保护树的根节点,并且对所述目标完整性保护树的根节点进行缓存。

17.根据权利要求11至16中任一项所述的内存控制器,其中,针对所述内存控制器所使用的所述N棵完整性保护树中的任一完整性保护树:该完整性保护树还包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级包括多个中间节点,每个叶子节点和每个中间节点均包括哈希值和多个子节点,每个子节点表示一个版本值,并且叶子节点和中间节点包括相同数量的子节点;

在每个叶子节点中,每个子节点表示该完整性保护树对应的区域中的一个数据块的版本值;

每个叶子节点的父节点为紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,紧接在根节点之下的中间层级的每个中间节点的父节点为该根节点,其余中间层级的中间节点的父节点为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;

对于每个中间节点或每个叶子节点,其任一子节点的版本值的更新使得其父节点的版本值更新;

对于每个中间节点或每个叶子节点,其哈希值是基于其所有子节点的版本值和其父节点的版本值得到的。

18.根据权利要求11至16中任一项所述的内存控制器,其中,针对所述内存控制器所使用的所述N棵完整性保护树中的任一完整性保护树,该完整性保护树还包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级包括多个中间节点;

每个中间节点至少包括哈希值和多个子节点;

每个叶子节点包括全局版本值、哈希值以及多个子节点;

处于同一层级的节点具有相同数量的子节点,并且叶子节点中的子节点数量不同于中间节点中的子节点数量;

在每个叶子节点中,每个子节点表示该完整性保护树对应的区域中的一个数据块的局部版本值,该叶子节点中的全局版本值由该叶子节点中的所有子节点共享,子节点的长度小于全局版本值的长度;

在每个叶子节点中,每个子节点的局部版本值是基于相应数据块的更新而被更新的,其中,当任一局部版本值溢出而返回初始值时,全局版本值被更新;

每个叶子节点的父节点是紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,并且该叶子节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;

在每个叶子节点中,哈希值是至少基于其全局版本值、其父节点的版本值以及其所有子节点的局部版本值来得到的。

19.根据权利要求18所述的内存控制器,其中,

对于所述至少一个中间层级而言,在叶子节点之上的K个中间层级中,每个中间节点包括全局版本值、哈希值和多个子节点,每个子节点表示一个局部版本值,该中间节点的全局版本值由该中间节点中的所有子节点共享,子节点的长度小于全局版本值的长度,并且当该中间节点的任一局部版本值溢出而返回初始值时,该中间节点的全局版本值被更新,K为正整数;

在每个叶子节点中,哈希值是基于其全局版本值、其父节点的版本值、其所有子节点的局部版本值、以及其父节点所属的中间节点的全局版本值来得到的;

紧接在根节点之下的中间层级的每个中间节点的父节点为该根节点,其余中间层级的中间节点的父节点为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;

对于任一中间节点而言:

如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值、其父节点的局部版本值和其父节点所属的节点的全局版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的局部版本值更新;

如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值和其父节点的版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;

如果该中间节点不具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的所有子节点的版本值和其父节点的版本值来得到的,并且该中间节点的任一子节点的版本值的更新使得其父节点的版本值更新。

20.根据权利要求19所述的内存控制器,其中,在从根节点到叶子节点的方向上,除了根节点之外,每一层级的节点中的子节点数量少于在该层级之下的层级的节点中的子节点数量。

21.一种可信片上系统的内存控制器,包括:

至少一个处理模块;

与所述至少一个处理模块进行通信的存储模块,其上存储有可执行指令,所述可执行指令在被所述至少一个处理器执行时使得所述至少一个处理器实现根据权利要求1至10中任一项所述的方法。

22.一种机器可读存储介质,存储有可执行指令,所述可执行指令在被机器执行时使得机器实现根据权利要求1至10中任一项所述的方法。

说明书 :

用于内存完整性保护的方法和内存控制器

技术领域

[0001] 本说明书的实施例涉及信息技术领域,并且更具体地,涉及用于内存完整性保护的方法、内存控制器和机器可读存储介质。

背景技术

[0002] 随着信息时代和大数据时代的来临以及云计算的广泛运用,数据信息安全已经成为业界关注的焦点之一。例如,隐私或敏感数据(诸如用户密码、数据加密密钥等的用户私密数据)通常被存储在内存中,而攻击者往往通过内存攻击来窃取或篡改这样的数据,由此可能带来极大的风险。因此,如何对内存进行有效保护成为亟需解决的问题之一。

发明内容

[0003] 考虑到现有技术的上述问题,本说明书的实施例提供了用于内存完整性保护的方法、内存控制器和机器可读存储介质。
[0004] 一方面,本说明书的实施例提供了一种用于内存完整性保护的方法,其中,所述方法由可信片上系统的内存控制器执行,所述方法包括:接收所述可信片上系统的处理器对可信内存的访问请求,其中:所述可信内存被划分为N个区域,所述N个区域分别与用于完整性保护的N棵完整性保护树相对应,N为大于1的正整数,每棵完整性保护树至少包括根节点和多个叶子节点,每个叶子节点具有针对相应区域中的至少一个数据块的版本值,所述根节点具有基于所述多个叶子节点而得到的版本值;所述访问请求包括要访问的目标内存地址;在所述N棵完整性保护树中确定与所述目标内存地址对应的目标完整性保护树;基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。
[0005] 另一方面,本说明书的实施例提供了一种可信片上系统的内存控制器,包括:接收单元,其接收所述可信片上系统的处理器对可信内存的访问请求,其中:所述可信内存被划分为N个区域,所述N个区域分别与用于完整性保护的N棵完整性保护树相对应,N为大于1的正整数,每棵完整性保护树至少包括根节点和多个叶子节点,每个叶子节点具有针对相应区域中的至少一个数据块的版本值,所述根节点具有基于所述多个叶子节点而得到的版本值;所述访问请求包括要访问的目标内存地址;确定单元,其在所述N棵完整性保护树中确定与所述目标内存地址对应的目标完整性保护树;验证单元,其基于所述目标完整性保护树,针对所述目标内存地址进行完整性验证。
[0006] 另一方面,本说明书的实施例提供了一种可信片上系统的内存控制器,包括:至少一个处理模块;与所述至少一个处理器进行通信的存储模块,其上存储有可执行指令,所述可执行指令在被所述至少一个处理模块执行时使得所述至少一个处理模块实现上述方法。
[0007] 另一方面,本说明书的实施例提供了一种机器可读存储介质,存储有可执行指令,所述可执行指令在被机器执行时使得机器实现上述方法。

附图说明

[0008] 通过结合附图对本说明书的实施例的更详细的描述,本说明书的实施例的上述以及其它目的、特征和优势将变得更加明显,其中,在本说明书的实施例中,相同的附图标记通常代表相同的元素。
[0009] 图1是可以用于实现本文的技术方案的可信架构的一个示例。
[0010] 图2是根据一些实施例的用于内存完整性保护的方法的示意性流程图。
[0011] 图3A示出了完整性保护树的结构的一个示例。
[0012] 图3B示出了完整性保护树的结构的另一示例。
[0013] 图3C示出了完整性保护森林的结构的一个示例。
[0014] 图3D示出了完整性保护森林的结构的另一示例。
[0015] 图3E示出了针对完整性保护树的挂载和卸载过程的一个示例。
[0016] 图4是根据一些实施例的内存控制器的示意框图。
[0017] 图5是根据一些实施例的内存控制器的硬件结构图。

具体实施方式

[0018] 现在将参考各实施例讨论本文描述的主题。应当理解的是,讨论这些实施例仅是为了使得本领域技术人员能够更好地理解并且实现本文描述的主题,并非是对权利要求书中所阐述的保护范围、适用性或者例子的限制。可以在不脱离权利要求书的保护范围的情况下,对所讨论的元素的功能和排列进行改变。各个实施例可以根据需要,省略、替换或者添加各种过程或组件。
[0019] 如本文中使用的,术语“包括”及其变型表示开放的术语,含义是“包括但不限于”。术语“基于”表示“至少部分地基于”。术语“一个实施例”和“一实施例”表示“至少一个实施例”。术语“另一个实施例”表示“至少一个其它实施例”。术语“第一”、“第二”等可以指代不同的或相同的对象。下面可以包括其它的定义,无论是明确的还是隐含的,除非上下文中明确地指明,否则一个术语的定义在整个说明书中是一致的。
[0020] 目前,内存攻击是篡改或窃取被存储在内存中的隐私或敏感数据的主要攻击手段之一,而内存完整性保护是防御内存攻击的有效方式之一。通过内存完整性保护,能够及时地识别内存中的隐私或敏感数据是否被替换或破坏等,从而确保数据安全性。
[0021] 鉴于此,本文的实施例提供了一种用于内存完整性保护的技术方案。在该技术方案中,可以通过完整性保护树来对内存进行完整性保护。相应地,这样的内存可以被称为可信内存。下面将结合具体实施例来描述本文的技术方案。
[0022] 图1是可以用于实现本文的技术方案的可信架构的一个示例。应当理解的是,图1的示例仅是为了帮助本领域技术人员更好地理解本文的实施例。在不同的实施例中,可信架构可以采用不同的方式来实现,本文对此不作限制。
[0023] 如图1所示,可信架构100可以包括可信片上系统110和可信内存120。可信片上系统110可以包括处理器112和内存控制器114。可信内存120可以用于存储各种需要被保护的数据,比如本文提到的隐私或敏感数据。
[0024] 处理器112可以通过内存控制器114来访问可信内存120,比如从可信内存120读取数据或者将数据写入可信内存120中。
[0025] 例如,当处理器112需要从可信内存120中读取数据或者将数据写入可信内存120中时,处理器112可以向内存控制器114发送访问请求。访问请求可以包括要访问的目标内存地址。内存控制器114可以解析访问请求,并且基于其包括的目标内存地址来读取或者写入相应的数据。
[0026] 在本文的实施例中,为了防御内存攻击等各种潜在攻击,可以通过完整性保护树来对可信内存120进行完整性保护。因此,在执行访问请求之前,内存控制器114可以针对目标内存地址进行完整性验证。
[0027] 例如,如果访问请求是读请求,则内存控制器114可以对被存储在目标内存地址处的数据进行完整性验证,如果验证通过,则可以向处理器114返回相应的数据。
[0028] 如果访问请求是写请求,则内存控制器114可以对被存储在目标内存地址处的旧数据进行完整性验证,如果验证通过,则可以说明该目标内存地址是安全的,因此内存控制器114可以将相应的新数据写入该目标内存地址处。
[0029] 下面将结合具体实施例来描述如何利用本文的技术方案进行内存完整性保护。
[0030] 图2是根据一些实施例的用于内存完整性保护的方法的示意性流程图。图2的方法可以由可信片上系统的内存控制器来执行,比如上述内存控制器114。
[0031] 如图2所示,在步骤202中,可以接收可信片上系统的处理器对可信内存的访问请求。访问请求可以包括要访问的目标内存地址。
[0032] 如前所述,可信内存可以通过完整性保护树来进行完整性保护。具体地,可信内存可以被划分为N个区域,N个区域可以分别与用于完整性保护的N棵完整性保护树相对应。此处,N可以为大于1的正整数。
[0033] 也就是说,每个区域可以通过一棵完整性保护树进行完整性保护。
[0034] 完整性保护树可以是树形的数据结构。例如,每棵完整性保护树可以至少包括根节点和多个叶子节点,每个叶子节点可以具有该完整性保护树所对应的区域中的至少一个数据块的版本值,根节点可以具有基于多个叶子节点得到的版本值。
[0035] 在步骤204中,可以在N棵完整性保护树中确定与目标内存地址对应的目标完整性保护树。
[0036] 由于每棵完整性保护树可以对应于一个区域,因此,可以基于目标内存地址来确定其对应的目标完整性保护树。
[0037] 在步骤206中,可以基于目标完整性保护树,针对目标内存地址进行完整性验证。
[0038] 例如,如前所述,如果访问请求是读请求,则可以利用目标完整性保护树的各节点的版本值、与在目标内存地址处存储的数据块对应的叶子节点的版本值以及该数据块的内容,对该数据块进行完整性验证。如果验证通过,则可以将该数据块返回给处理器。
[0039] 如果访问请求是写请求,则可以利用目标完整性保护树的各节点的版本值、与在目标内存地址处存储的旧数据块对应的叶子节点的版本值以及该旧数据块的内容,对该旧数据块进行完整性验证。如果验证通过,则说明该目标内存地址是安全的,那么可以将新数据块写到该目标内存地址处。
[0040] 在某些实现方式中,可能采用单棵完整性保护树来对整个可信内存进行完整性保护。完整性保护树一般是树形的数据结构,每个叶子节点具有至少一个数据块的版本值。因此,如果可信内存的容量增大,则意味着要保护的数据块增多,那么完整性保护树的叶子节点的数量将增加,相应地中间节点的数量也增加。这样,单棵完整性保护树需要较多的层数来保护整个可信内存。然而,这会导致在进行完整性验证时叶子节点和中间节点的命中率极大降低,由此显著增加可信内存的读写性能开销。
[0041] 而在本文的实施例中,可以将可信内存划分为多个区域,每个区域可以通过一棵完整性保护树进行完整性保护,这样在可信内存的容量变化时,可以灵活地调整完整性保护树的数量来实现完整性保护。此外,由于每棵完整性保护树保护一块区域,因此可以将每棵完整性保护树的叶子节点数量和层数控制在可接受的性能开销范围内。可见,本文的实施例能够在有限的内存读写性能开销下高效地实现内存完整性保护。
[0042] 目前,正处于大数据和云计算快速发展的时期,隐私或敏感数据的数据量也越来越大,因此对大容量的可信内存也有着迫切的需求。然而,如前所述,简单地使用单棵完整性保护树对可信内存进行完整性保护具有若干弊端。而本文的实施例能够在可控制的性能开销范围内,为大容量的可信内存提供良好的完整性保护,满足当前为大量数据提供安全保护的需求,从而良好地适应当前应用的发展趋势。
[0043] 当然,对完整性保护树本身进行完整性保护也是非常关键的。例如,可以将完整性保护树存储在可信存储空间中,从而保护完整性保护树的完整性。然而,在一些实施例中,为了减少可信存储空间的资源开销,可以将完整性保护树存储在非可信存储空间处,而其根节点可以被缓存在可信存储空间中。通过确保完整性保护树的根节点的完整性,就可以确保整棵完整性保护树的完整性。
[0044] 在本文的实施例中,由于可信片上系统本身是可信的,因此可信存储空间可以位于内存控制器中。
[0045] 在一些实施例中,如果内存控制器的存储空间足够大,则可以将上述N棵完整性保护树的根节点全部缓存在内存控制器中。在这种情况下,不仅能够对所有完整性保护树进行完整性保护,而且能够提升完整性验证的效率。
[0046] 然而,在一些情况下,内存控制器的存储空间可能是有限的,因此缓存所有完整性保护树的根节点可能不太可行。进一步考虑到处理器对内存的访问通常具有局域性,即在一段时间内,处理器可能访问某一部分的内存,而不会随机访问整个内存。因此,在本文的一些实施例中,可以将部分完整性保护树的根节点缓存在内存控制器中,由此适应内存控制器的存储空间有限的情况。例如,可以将M棵完整性保护树的根节点缓存在内存控制器中,M可以为小于N的正整数。
[0047] 基于处理器的内存访问的局域性,可以针对根节点被缓存在内存控制器中的完整性保护树增加一定的约束条件。例如,上述M棵完整性保护树各自对应的区域可以在从当前时间往前的预定时段内被处理器访问过。也就是说,这M棵完整性保护树各自对应的区域可以是处理器当前正在访问或在之前某段时间内访问过。此处的预定时段可以是根据实际需求等各种因素来设定的。
[0048] 而对于根节点未被缓存在内存控制器中的其余完整性保护树,也需要通过一定的机制来保护其完整性。鉴于此,在本文的实施例中,可以定义森林根树。N棵完整性保护树的根节点可以形成森林根树的叶子节点,而森林根树的根节点可以是基于叶子节点得到的。例如,可以通过消息验证算法对N棵完整性保护树的根节点的版本值进行运算,来得到森林根树的根节点的版本值。为了保护N棵完整性保护树的完整性,森林根树的根节点应当是常驻于内存控制器中。也就是说,森林根树的根节点是整个完整性检查体系的可信基础,因此需要将其常驻在内存控制器中,从而防止被攻击者篡改或替换。
[0049] 此外,可以理解的是,在一些情况下,森林根树还可以包括至少一个中间层级,每个中间层级可以包括多个中间节点。每一层级的节点可以是其下一层级的多个节点的父节点,从而形成树形结构。森林根树的中间节点可以被存储在内存控制器中或者被存储在非可信存储空间中。如果被存储在非可信存储空间中,可以基于具体的实现(比如内存控制器的存储空间大小),将森林根树的中间节点缓存在内存控制器中。本文对此不作限定。
[0050] 在一些情况下,内存控制器还可以缓存M棵完整性保护树的其它节点(比如中间节点、叶子节点等),本文对此不作限定,这取决于内存控制器的存储空间大小和实际实现等各种因素。
[0051] 可见,在本文的实施例中,可以定义完整性保护树的两种状态,即活跃状态和不活跃状态。根节点被缓存在内存控制器中的完整性保护树可以被认为处于活跃状态,而根节点未被缓存在内存控制器中的完整性保护树可以被认为处于不活跃状态。例如,上述M棵完整性保护树可以被认为处于活跃状态,而其余完整性保护树被认为处于不活跃状态。
[0052] 可见,在这样的实施例中,N棵完整性保护树可以形成完整性保护森林,每棵完整性保护树可以保护对应的内存区域的完整性,而森林根树可以保护N棵完整性保护树的完整性,从而以简单且高效的方式实现对可信内存的完整性保护。
[0053] 相应地,在步骤206中,对于目标完整性保护树处于活跃状态或不活跃状态,可以采用不同的方式进行完整性验证。
[0054] 例如,如果内存控制器缓存有目标完整性保护树的根节点,则可以直接基于目标完整性保护树,针对目标内存地址进行完整性验证。
[0055] 如果内存控制器未缓存有目标完整性保护树的根节点,则可以基于森林根树的根节点以及N棵完整性保护树的根节点,对目标完整性保护树的根节点进行验证。
[0056] 例如,可以对N棵完整性保护树的根节点的版本值进行哈希运算,得到森林根树的根节点的哈希值,然后将该哈希值与常驻在内存控制器中的森林根树的根节点的哈希值进行比较,如果两者一致,则可以说明目标完整性保护树的根节点未被篡改。
[0057] 在对目标完整性保护树的根节点的完整性验证通过之后,可以从非可信存储空间读取目标完整性保护树的根节点并且将其缓存在内存控制器中。然后,可以基于目标完整性保护树,针对目标内存地址进行完整性验证。这可以称为挂载过程,即将目标完整性保护树挂载到内存控制器中。
[0058] 在一些实现方式中,完整性保护树的根节点除了包括版本值之外,还可以包括该完整性保护树在非可信存储空间中的存储地址。因此,在基于目标完整性保护树进行完整性验证时,可以首先基于根节点中的存储地址,获取目标完整性保护树的各个节点(比如中间节点、叶子节点),进而基于这些节点以及数据块的内容进行完整性验证。
[0059] 在一些情况下,如果内存控制器的剩余存储空间不足以缓存目标完整性保护树的根节点,则可以从内存控制器中删除M棵完整性保护树中的一棵完整性保护树的根节点。这可以称为卸载过程,即将该棵完整性保护树从内存控制器中卸载。之后,可以从非可信存储空间读取目标完整性保护树的根节点,并且将目标完整性保护树的根节点缓存在内存控制器中。
[0060] 这类似于现有的缓存淘汰机制。因此,可以采用各种适用的淘汰算法来选择要从内存控制器中删除的完整性保护树。
[0061] 例如,可以采用最近最少使用(Least Recently Used,LRU)算法,从内存控制器中删除M棵完整性保护树中的一棵完整性保护树的根节点,以便留出空间缓存目标完整性保护树的根节点。
[0062] 可见,通过挂载过程,目标完整性保护树可以从不活跃状态转换为活跃状态。而通过卸载过程,从内存控制器中删除其根节点的完整性保护树可以从活跃状态转换为不活跃状态。因此,随着挂载过程或卸载过程,完整性保护树可以在活跃状态与不活跃状态之间转换。
[0063] 另外,在本文的实施例中,完整性保护树可以采用各种适用的结构来实现。
[0064] 例如,在一个实施例中,针对N棵完整性保护树中的任一完整性保护树而言:
[0065] 该完整性保护树还可以包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级可以包括多个中间节点。也就是说,从完整性保护树的从上往下的树形结构来看,完整性保护树可以包括根节点、中间节点和叶子节点;
[0066] 每个叶子节点和每个中间节点均包括哈希值和多个子节点,每个子节点可以表示一个版本值,并且叶子节点和中间节点可以包括相同数量的子节点;
[0067] 在每个叶子节点中,每个子节点可以表示该完整性保护树对应的区域中的一个数据块的版本值;
[0068] 每个叶子节点的父节点可以是紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,紧接在根节点之下的中间层级的每个中间节点的父节点可以是该根节点,其余中间层级的中间节点的父节点可以是紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;
[0069] 对于每个中间节点或每个叶子节点,其任一子节点的版本值的更新使得其父节点的版本值更新;
[0070] 对于每个中间节点或每个叶子节点,其哈希值可以是基于所有子节点的版本值和其父节点的版本值得到的。
[0071] 为了便于理解这种结构,下面结合具体示例进行描述。应当理解的是,以下示例仅是为了帮助本领域技术人员更好地明白本文的实施例,而非对其范围进行限制。
[0072] 图3A示出了完整性保护树的结构的一个示例。
[0073] 在图3A的示例中,完整性保护树300可以包括根节点、两个中间层级以及多个叶子节点。每个中间层级可以包括多个中间节点。无论是叶子节点还是中间节点,都可以包括哈希值和多个子节点。另外,在下文中,在某些情况下为了便于描述,可能将根节点、中间节点和叶子节点统称为节点。
[0074] 另外,为了便于理解,下文将以中间节点301、中间节点302和叶子节点303为例来说明,处于同一层级的其它中间节点、叶子节点是类似的,因此将不再赘述。
[0075] 如图3A所示,根节点可以是中间节点301的父节点。中间节点301的一个子节点304可以是中间节点302的父节点。类似地,中间节点302的一个子节点305可以是叶子节点303的父节点,由此形成具有树形结构的完整性保护树300。
[0076] 在叶子节点303中,每个子节点可以对应于一个数据块,并且可以表示针对该数据块的版本值。比如,子节点306对应于数据块307。在中间节点302、301中,每个子节点可以表示一个版本值。此外,根节点也表示一个版本值。
[0077] 通常,各个版本值可以具有某个初始值(比如0)。当某个数据块被更新时,在叶子节点中与其对应的子节点的版本值递增,相应地该叶子节点的父节点的版本值递增,父节点所属的节点的父节点的版本值递增,以此类推,一直到根节点递增为止。例如,当数据块307被更新时,子节点306的版本值递增,子节点305的版本值随之递增,子节点304的版本值也随之递增,之后根节点的版本值递增。
[0078] 此外,通过将叶子节点中的每个子节点的版本值与相应数据块的内容进行哈希运算,可以得到消息验证码,其用于验证数据块的完整性。例如,通过将子节点306的版本值与数据块307的内容进行哈希运算,可以得到针对数据块307的消息验证码。
[0079] 叶子节点303的哈希值可以通过对其父节点305的版本值和叶子节点303的所有子节点的版本值进行哈希运算来得到。类似地,中间节点302的哈希值可以通过对其父节点304的版本值和中间节点302的所有子节点的版本值进行哈希运算来得到。中间节点301的哈希值可以通过对根节点的版本值和中间节点301的所有子节点的版本值进行哈希运算来得到。
[0080] 另外,在该示例中,各个节点可以具有相同的长度,各个子节点具有相同的长度,各个哈希值也可以具有相同的长度。
[0081] 例如,各个节点的长度可以是一条缓存行的大小,比如64字节。哈希值的长度可以是64位。因此,子节点的长度可以决定每个节点中的子节点数量。例如,在考虑效率和读写性能开销等因素的情况下,子节点的长度可以是56位,因此每个节点中的子节点数量可以为8。
[0082] 应当理解的是,在图3A中所示的具体节点数量、层数等仅是示例,本文并不限于此。
[0083] 在本文的实施例中,完整性保护树还可以采用其它结构来实现。下面将描述完整性保护树的另一种示例结构。
[0084] 例如,针对N棵完整性保护树中的任一完整性保护树:
[0085] 该完整性保护树还可以包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级可以包括多个中间节点;也就是说,在完整性保护树的从上往下的树形结构来看,该完整性保护树可以包括根节点、中间节点和叶子节点;
[0086] 每个中间节点至少可以包括哈希值和多个子节点;
[0087] 每个叶子节点可以包括全局版本值、哈希值以及多个子节点;
[0088] 处于同一层级的节点可以具有相同数量的子节点,并且叶子节点中的子节点数量可以不同于中间节点中的子节点数量;
[0089] 在每个叶子节点中,每个子节点可以表示该完整性保护树对应的区域中的一个数据块的局部版本值,该叶子节点中的全局版本值可以由该叶子节点中的所有子节点共享,子节点的长度可以小于全局版本值的长度;
[0090] 在每个叶子节点中,每个子节点的局部版本值可以是基于相应数据块的更新而被更新的,其中,当任一局部版本值溢出而返回初始值时,全局版本值被更新;
[0091] 每个叶子节点的父节点可以是紧接在该叶子节点之上的中间层级中的一个中间节点的一个子节点,并且该叶子节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;
[0092] 在每个叶子节点中,哈希值可以是至少基于其全局版本值、其父节点的版本值以及其所有子节点的局部版本值来得到的。
[0093] 另外,对于上述至少一个中间层级而言,在叶子节点之上的K个中间层级中,每个中间节点包括全局版本值、哈希值和多个子节点,每个子节点表示一个局部版本值,该中间节点的全局版本值由该中间节点中的所有子节点共享,子节点的长度小于全局版本值的长度,并且当该中间节点的任一局部版本值溢出而返回初始值时,该中间节点的全局版本值被更新,K为正整数;
[0094] 在这种情况下,在每个叶子节点中,哈希值可以基于该叶子节点的全局版本值、其父节点的版本值、其所有子节点的局部版本值、以及其父节点所属的中间节点的全局版本值来得到。
[0095] 此外,紧接在根节点之下的中间层级的每个中间节点的父节点可以为该根节点,其余中间层级的中间节点的父节点可以为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点。
[0096] 另外,对于任一中间节点而言:
[0097] 如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点具有全局版本值,则该中间节点的哈希值是通过该中间节点的全局版本值、该中间节点的所有子节点的局部版本值、其父节点的局部版本值和其父节点所属的节点的全局版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的局部版本值更新;
[0098] 如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值和其父节点的版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;
[0099] 如果该中间节点不具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的所有子节点的版本值和其父节点的版本值来得到的,并且该中间节点的任一子节点的版本值的更新使得其父节点的版本值更新。
[0100] 在一些情况下,在从根节点到叶子节点的方向上(也就是树形结构的从上往下的方向上),除了根节点之外,每一层级的节点中的子节点数量少于在该层级之下的层级的节点中的子节点数量。
[0101] 为了便于理解这种结构,下面结合具体示例进行描述。应当理解的是,以下示例仅是为了帮助本领域技术人员更好地明白本文的实施例,而非对其范围进行限制。
[0102] 图3B示出了完整性保护树的结构的另一示例。
[0103] 如图3B所示,完整性保护树310可以包括根节点、两个中间层级和叶子节点。每个中间层级可以包括多个中间节点。在下文中,为了便于描述,在某些情况下可能将根节点、中间节点和叶子节点统称为节点。
[0104] 另外,为了便于理解,下文将以中间节点311、中间节点312和叶子节点313为例来说明,处于同一层级的其它中间节点、叶子节点是类似的,因此将不再赘述。
[0105] 如图3B所示,根节点可以是中间节点311的父节点。中间节点311的一个子节点314可以作为中间节点312的父节点。类似地,中间节点312的一个子节点315可以作为叶子节点313的父节点。由此,形成具有树形结构的完整性保护树310。
[0106] 与图3A不同的是,叶子节点313可以包括全局版本值、哈希值以及多个子节点。全局版本值可以由叶子节点313的所有子节点共享。每个子节点可以表示完整性保护树310对应的区域中的一个数据块的局部版本值。
[0107] 另外,在图3B的示例中,中间节点312可以包括全局版本值、哈希值以及多个子节点。与叶子节点313类似,在中间节点312中,全局版本值可以由中间节点312的所有子节点共享,每个子节点可以表示一个局部版本值。
[0108] 中间节点311与图3A中所示的中间节点301、302类似,其包括哈希值以及多个子节点,而可以不包括全局版本值。每个子节点可以表示一个版本值。
[0109] 在图3B的示例中,针对某些层级的节点增加了全局版本值,因此版本值的更新过程可能与图3A有所不同。
[0110] 通常,全局版本值、局部版本值或者版本值可以具有某个初始值(比如0)。当某个数据块被更新时,在叶子节点中与其对应的子节点的局部版本值递增。当叶子节点中的所有子节点的局部版本值都没有发生溢出时,则全局版本值保持不变,而当任一局部版本值溢出而返回到其初始值时,全局版本值递增。
[0111] 无论是叶子节点的局部版本值还是全局版本值递增,都会引起其父节点的版本值或局部版本值递增。
[0112] 类似地,如果中间节点具有全局版本值,则其所有子节点的局部版本值都没有发生溢出时,全局版本值保持不变,而当任一局部版本值溢出而返回到其初始值时,全局版本值递增。以此类推,一直到根节点递增为止。
[0113] 例如,当数据块317被更新时,子节点316的局部版本值递增,如果子节点316的局部版本值没有发生溢出,则叶子节点313的全局版本值保持不变。如果子节点316的局部版本值溢出,则叶子节点313的全局版本值递增。
[0114] 无论叶子节点313属于上述哪种情况,子节点315的局部版本值都随之递增,如果子节点315的局部版本值没有发生溢出,则中间节点312全局版本值保持不变。如果子节点315的局部版本值溢出,则中间节点312的全局版本值递增。
[0115] 无论中间节点312属于上述哪种情况,子节点314的版本值都随之递增,之后根节点的版本值递增。相应地,各个节点中的哈希值的计算过程可以将全局版本值考虑在内。
[0116] 如图3B所示,可以对叶子节点313的全局版本值、子节点316的局部版本值、以及数据块317的内容进行哈希运算,得到针对数据块317的消息验证码。消息验证码可以用于验证该数据块317的完整性。
[0117] 叶子节点313中的哈希值可以通过对其全局版本值、其父节点315的局部版本值以及叶子节点313的所有子节点的局部版本值进行哈希运算来得到。
[0118] 中间节点312的哈希值可以通过对其父节点314的版本值、中间节点312的全局版本值以及其所有子节点的局部版本值进行哈希运算来得到。
[0119] 中间节点311的哈希值可以通过对根节点的版本值和其所有子节点的版本值进行哈希运算来得到。
[0120] 另外,由于添加了全局版本值,因此与图3A不同的是,在图3B的示例中,处于同一层级的节点可以具有相同数量的子节点,而处于不同层级的节点可以具有不同数量的子节点。
[0121] 例如,各个节点可以具有相同的长度,各个全局版本值可以具有相同的长度,各个哈希值也可以具有相同的长度。而在每一层级中,子节点的长度可以是变化的,导致各个层级的节点中的子节点数量可以变化。
[0122] 例如,假设各个节点的长度可以为一条缓存行的大小,比如64字节。各个节点的全局版本值可以具有64位,哈希值可以具有64位。
[0123] 在叶子节点313中,假设每个子节点可以具有12位,则叶子节点313可以包括32个子节点。
[0124] 在中间节点312中,假设每个子节点可以具有24位,则中间节点313可以具有16个子节点。
[0125] 在中间节点311中,假设每个子节点可以具有56位,则其可以具有8个子节点。
[0126] 可见,在从叶子节点到根节点的方向上,每一层级的节点中的子节点数量要高于其上一层级的节点中的子节点数量。
[0127] 从上述描述可以看出,局部版本值可能在更新过程中会溢出,导致其所属节点内的全局版本值的更新,这些操作可能会带来一定的开销。此外,越靠近根节点,局部版本值或版本值的更新将越快。因此,为了减少开销,越靠近根节点,局部版本值或版本值可以具有较长的长度。
[0128] 例如,叶子节点313的局部版本值可以具有12位,中间节点312的局部版本值可以具有24位,而中间节点311的版本值可以具有56位。相应地,子节点的数量取决于局部版本值的长度设置。
[0129] 另外,与图3A的结构相比,在图3B的结构中,由于除了根节点之外,至少一些层级(例如,叶子节点313、中间节点312所在的层级)的节点具有更多的子节点。因此,在完整性保护树的层数相同的情况下,图3B的结构能够保护更多的数据块,而且能够维持较少的层数,从而能够保护更大容量的可信内存,并且保持良好的读写性能。
[0130] 此外,应当理解的是,在图3A中所示的具体节点数量、层数等仅是示例,本文并不限于此。
[0131] 无论N棵完整性保护树采用上述哪一种结构来实现,其都可以形成完整性保护森林。为了便于理解,下面结合图3C来描述完整性保护森林的结构。
[0132] 图3C示出了完整性保护森林的结构的一个示例。
[0133] 如图3C所示,可信内存可以被划分为N个区域,例如,区域1至区域N。每个区域可以对应于一棵完整性保护树。如前所述,每棵完整性保护树可以包括根节点、中间节点和叶子节点。
[0134] 如前所述,N棵完整性保护树的所有节点可以被存储在非可信存储空间中。而在图3C的示例中,假设内存控制器具有足够大的存储空间,因此内存控制器可以缓存有N棵完整性保护树的根节点。这样,当接收到处理器的访问请求时,内存控制器可以直接基于相应的完整性保护树进行完整性验证。
[0135] 应当理解的是,为了便于说明,以简化图的方式示出了完整性保护树。因此,在图3C中示出的完整性保护树的具体层数、节点数量等仅是示例,本文并不限于此。
[0136] 图3D示出了完整性保护森林的结构的另一示例。同样,应当理解的是,为了便于说明,以简化图的方式示出了完整性保护树。因此,在图3D中示出的完整性保护树的具体层数、节点数量等仅是示例,本文并不限于此。
[0137] 与图3C的示例类似,可信内存可以被划分为N个区域,例如,区域1至区域N。每个区域可以对应于一棵完整性保护树。如前所述,每棵完整性保护树可以包括根节点、中间节点和叶子节点。同样,N棵完整性保护树的所有节点可以被存储在非可信存储空间中。
[0138] 与图3C的示例不同的是,假设内存控制器的存储空间是有限的,内存控制器仅可以缓存部分完整性保护树的根节点,例如M棵完整性保护树的根节点。如前所述,M棵完整性保护树对应的区域可以是处理器当前正在访问或者在先前的预定时段内访问过。
[0139] 此处假设完整性保护树2和完整性保护树3各自对应的区域2和区域3是处理器近期访问过的,因此,完整性保护树2和完整性保护树3的根节点可以被缓存在内存控制器中。
[0140] 在这种情况下,完整性保护树2和完整性保护树3可以被认为是处于活跃状态,而其余完整性保护树可以被认为处于不活跃状态。
[0141] 如前所述,为了保护处于不活跃状态的完整性保护树的完整性,可以定义森林根树。N棵完整性保护树的根节点可以作为森林根树的叶子节点。可以基于消息验证算法对N棵完整性保护树的根节点进行运算,从而得到森林根树的根节点。
[0142] 森林根树的根节点可以常驻在内存控制器中,从而保护N棵完整性保护树的完整性。
[0143] 应当理解的是,为了便于说明,在图3D中仅示出了森林根树的根节点,在一些实施例中,森林根树还可以包括中间节点。森林根树的中间节点可以被缓存在内存控制器中,或者也可以不被缓存在内存控制器中,这可以取决于内存控制器的存储空间、具体实现需求等各种因素,本文对此不作限定。
[0144] 如前所述,如果针对访问请求进行完整性验证时发现对应的完整性保护树的根节点未被缓存在内存控制器中,则内存控制器可以从非可信存储空间读取该完整性保护树的根节点,并且将其缓存到内存控制器中,该过程可以被称为挂载过程。
[0145] 如果内存控制器的剩余存储空间不足以缓存该完整性保护树的根节点,则内存控制器可以将已经被缓存在内存控制器中的其它完整性保护树的根节点移出内存控制器,该过程可以被称为卸载过程。然后,内存控制器可以将待挂载的完整性保护树的根节点缓存在内存控制器中。
[0146] 图3E示出了针对完整性保护树的挂载和卸载过程的一个示例。
[0147] 如图3E所示,假设当前需要基于完整性保护树N进行完整性验证,但是完整性保护树N的根节点未被缓存在内存控制器中。那么,内存控制器可以将完整性保护树N的根节点挂载到内存控制器中。
[0148] 如果当前的存储空间不足以缓存完整性保护树N的根节点,则内存控制器可以将已经挂载的完整性保护树的根节点移出内存控制器。例如,假设根据LRU算法,内存控制器可以将完整性保护树3的根节点卸载。然后,内存控制器可以将完整性保护树N的根节点缓存在内存控制器中。
[0149] 应当理解的是,在进行挂载时,内存控制器可以根据森林根树的根节点以及N棵完整性保护树的根节点,对完整性保护树N的根节点进行完整性验证。如果完整性验证通过,则可以将完整性保护树N的根节点挂载到内存控制器中。
[0150] 这样,能够节省内存控制器的存储空间,而且也能够确保各棵完整性保护树的完整性。
[0151] 图4是根据一些实施例的内存控制器的示意框图。例如,内存控制器400可以位于可信片上系统中。
[0152] 如图4所示,内存控制器400可以包括接收单元402、确定单元404和验证单元406。
[0153] 接收单元402可以接收可信片上系统的处理器对可信内存的访问请求。此处,可信内存可以被划分为N个区域,N个区域可以分别与用于完整性保护的N棵完整性保护树相对应,N为大于1的正整数。
[0154] 每棵完整性保护树至少可以包括根节点和多个叶子节点,每个叶子节点具有针对相应区域中的至少一个数据块的版本值,根节点具有基于多个叶子节点而得到的版本值。
[0155] 访问请求可以包括要访问的目标内存地址。
[0156] 确定单元404可以在N棵完整性保护树中确定与目标内存地址对应的目标完整性保护树。
[0157] 验证单元406可以基于目标完整性保护树,针对目标内存地址进行完整性验证。
[0158] 在一些实施例中,内存控制器400还可以包括第一缓存单元408。第一缓存单元408可以至少缓存有N棵完整性保护树各自的根节点。
[0159] 在一些实施例中,内存控制器400还可以包括第二缓存单元410。第二缓存单元410可以至少缓存有N棵完整性保护树中的M棵完整性保护树的根节点,M棵完整性保护树各自对应的区域在从当前时间往前的预定时段内被处理器访问过,M为小于N的正整数。
[0160] N棵完整性保护树的根节点形成森林根树的叶子节点。森林根树的根节点是基于森林根树的叶子节点得到的。森林根树的根节点常驻在第二缓存单元410中。
[0161] 在一些实施例中,如果第二缓存单元410缓存有目标完整性保护树的根节点,则验证单元406可以直接基于目标完整性保护树,针对目标内存地址进行完整性验证。
[0162] 在一些实施例中,N棵完整性保护树可以被存储在可信片上系统之外的非可信存储空间中。
[0163] 如果第二缓存单元410未缓存有目标完整性保护树的根节点,则验证单元406可以基于森林根树的根节点以及N棵完整性保护树的根节点,对目标完整性保护树的根节点进行完整性验证。
[0164] 如果验证单元406对目标完整性保护树的根节点的完整性验证通过,则第二缓存单元410可以从非可信存储空间读取目标完整性保护树的根节点,并且对目标完整性保护树的根节点进行缓存。
[0165] 然后,验证单元406可以基于目标完整性保护树,针对目标内存地址进行完整性验证。
[0166] 在一些实施例中,如果第二缓存单元410的剩余存储空间不足以缓存目标完整性保护树的根节点,则第二缓存单元410可以从第二缓存单元410中删除M棵完整性保护树中的一棵完整性保护树的根节点。然后,第二缓存单元410可以从非可信存储空间读取目标完整性保护树的根节点,并且对目标完整性保护树的根节点进行缓存。
[0167] 在一些实施例中,针对内存控制器400所使用的N棵完整性保护树中的任一完整性保护树:
[0168] 该完整性保护树还包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级包括多个中间节点,每个叶子节点和每个中间节点均包括哈希值和多个子节点,每个子节点表示一个版本值,并且叶子节点和中间节点包括相同数量的子节点;
[0169] 在每个叶子节点中,每个子节点表示该完整性保护树对应的区域中的一个数据块的版本值;
[0170] 每个叶子节点的父节点为紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,紧接在根节点之下的中间层级的每个中间节点的父节点为该根节点,其余中间层级的中间节点的父节点为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;
[0171] 对于每个中间节点或每个叶子节点,其任一子节点的版本值的更新使得其父节点的版本值更新;
[0172] 对于每个中间节点或每个叶子节点,其哈希值是基于其所有子节点的版本值和其父节点的版本值得到的。
[0173] 在一些实施例中,针对内存控制器400所使用的N棵完整性保护树中的任一完整性保护树,
[0174] 该完整性保护树还包括处于其根节点与处于最低层级的多个叶子节点之间的至少一个中间层级,每个中间层级包括多个中间节点;
[0175] 每个中间节点至少包括哈希值和多个子节点;
[0176] 每个叶子节点包括全局版本值、哈希值以及多个子节点;
[0177] 处于同一层级的节点具有相同数量的子节点,并且叶子节点中的子节点数量不同于中间节点中的子节点数量;
[0178] 在每个叶子节点中,每个子节点表示该完整性保护树对应的区域中的一个数据块的局部版本值,该叶子节点中的全局版本值由该叶子节点中的所有子节点共享,子节点的长度小于全局版本值的长度;
[0179] 在每个叶子节点中,每个子节点的局部版本值是基于相应数据块的更新而被更新的,其中,当任一局部版本值溢出而返回初始值时,全局版本值被更新;
[0180] 每个叶子节点的父节点是紧接在该叶子节点之上的中间层级的一个中间节点的一个子节点,并且该叶子节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;
[0181] 在每个叶子节点中,哈希值是至少基于其全局版本值、其父节点的版本值以及其所有子节点的局部版本值来得到的。
[0182] 在一些实施例中,对于上述至少一个中间层级而言,在叶子节点之上的K个中间层级中,每个中间节点包括全局版本值、哈希值和多个子节点,每个子节点表示一个局部版本值,该中间节点的全局版本值由该中间节点中的所有子节点共享,子节点的长度小于全局版本值的长度,并且当该中间节点的任一局部版本值溢出而返回初始值时,该中间节点的全局版本值被更新,K为正整数;
[0183] 在每个叶子节点中,哈希值是基于其全局版本值、其父节点的版本值、其所有子节点的局部版本值、以及其父节点所属的中间节点的全局版本值来得到的;
[0184] 紧接在根节点之下的中间层级的每个中间节点的父节点为该根节点,其余中间层级的中间节点的父节点为紧接在该中间节点之上的中间层级的一个中间节点的一个子节点;
[0185] 对于任一中间节点而言:
[0186] 如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值、其父节点的局部版本值和其父节点所属的节点的全局版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的局部版本值更新;
[0187] 如果该中间节点具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的全局版本值、该中间节点的所有子节点的局部版本值和其父节点的版本值来得到的,并且该中间节点的全局版本值或任一局部版本值的更新使得其父节点的版本值更新;
[0188] 如果该中间节点不具有全局版本值并且该中间节点的父节点所属的节点不具有全局版本值,则该中间节点的哈希值是基于该中间节点的所有子节点的版本值和其父节点的版本值来得到的,并且该中间节点的任一子节点的版本值的更新使得其父节点的版本值更新。
[0189] 在一些实施例中,在从根节点到叶子节点的方向上,除了根节点之外,每一层级的节点中的子节点数量少于在该层级之下的层级的节点中的子节点数量。
[0190] 内存控制器400的各个单元可以执行图2至3E的方法实施例中的相应步骤,因此,为了描述的简洁,装置400的各个单元的具体操作和功能此处不再赘述。
[0191] 内存控制器400可以采用硬件实现,也可以采用软件实现,或者可以通过软硬件的组合来实现。
[0192] 图5是根据一些实施例的内存控制器的硬件结构图。如图5所示,内存控制器500可以包括至少一个处理模块502和存储模块504,并且至少一个处理模块502、存储模块504可以经由总线506进行连接。内存控制器500可以位于可信片上系统中。
[0193] 存储模块504可以存储可执行代码。在存储模块504中存储的可执行代码在被至少一个处理模块502执行时,使得内存控制器500实现以上结合图2‑3E描述的各种过程。
[0194] 此外,内存控制器500还可以包括缓存单元。缓存单元可以在存储模块504中实现,也可以独立于存储模块504来实现。缓存单元可以缓存如前所述的完整性保护树的节点、森林根树的节点等相关信息。
[0195] 本说明书的实施例还提供了一种机器可读存储介质。该机器可读存储介质可以存储有可执行代码,可执行代码在被机器执行时使得机器实现上面参照图2‑3E描述的方法实施例的具体过程。
[0196] 例如,机器可读存储介质可以包括但不限于随机存取存储器(Random Access Memory,RAM)、只读存储器(Read‑Only Memory,ROM)、电可擦除可编程只读存储器(Electrically‑Erasable Programmable Read‑Only Memory,EEPROM)、静态随机存取存储器(Static Random Access Memory,SRAM)、硬盘、闪存等等。
[0197] 应当理解的是,本说明书中的各个实施例均采用递进的方式来描述,各个实施例之间相同或相似的部分相互参见即可,每个实施例重点说明的都是与其它实施例的不同之处。例如,对于上述关于装置的实施例、关于计算设备的实施例以及关于机器可读存储介质的实施例而言,由于它们基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0198] 上文对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
[0199] 上述各流程和各系统结构图中不是所有的步骤和单元都是必须的,可以根据实际的需要忽略某些步骤或单元。上述各实施例中描述的装置结构可以是物理结构,也可以是逻辑结构,即,有些单元可能由同一物理实体实现,或者,有些单元可能分别由多个物理实体实现,或者,可以由多个独立设备中的某些部件共同实现。
[0200] 在整个本说明书中使用的术语“示例性”意味着“用作例子、实例或例示”,并不意味着比其它实施例“优选”或“具有优势”。出于提供对所描述技术的理解的目的,具体实施方式包括具体细节。然而,可以在没有这些具体细节的情况下实施这些技术。在一些实例中,为了避免对所描述的实施例的概念造成难以理解,公知的结构和装置以框图形式示出。
[0201] 以上结合附图详细描述了本公开内容的实施例的可选实施方式,但是,本公开内容的实施例并不限于上述实施方式中的具体细节,在本公开内容的实施例的技术构思范围内,可以对本公开内容的实施例的技术方案进行多种变型,这些变型均属于本公开内容的实施例的保护范围。
[0202] 本公开内容的上述描述被提供来使得本领域任何普通技术人员能够实现或者使用本公开内容。对于本领域普通技术人员来说,对本公开内容进行的各种修改是显而易见的,并且,也可以在不脱离本公开内容的保护范围的情况下,将本文所定义的一般性原理应用于其它变型。因此,本公开内容并不限于本文所描述的例子和设计,而是与符合本文公开的原理和新颖性特征的最广范围相一致。