一种适用于嵌入式处理器的数据完整性验证方法

文档序号:6603563阅读:143来源:国知局
专利名称:一种适用于嵌入式处理器的数据完整性验证方法
技术领域
本发明属于数字集成电路领域,具体涉及一种适用于嵌入式处理器的数据完整性 验证方法,该方法的核心是多粒度存储器散列计算,是一种具有高性能,少相关访问,低初 始化时间的数据完整性校验方法。由于在设计时就考虑了性能与开销等因素,该方法完全 适用于嵌入式系统,也适用于计算机系统,能够为其提供可靠的数据完整性验证。
背景技术
数据完整性验证是解决篡改攻击的有效手段。基于这一点,出现了散列函数, 消息认证码(MAC :Memory Authentication Code)禾口 AREA(AddedRedundancy Explicit Authentication)等方法。其中,散列函数(即Hash函数)是现代密码技术与应用的一个重要基础。在本文 中,散列函数对于数据机密性保护和完整性校验而言,是基础性的密码类运算。散列函数计 算一个任意长度的输入而得到一个定长的输出,该输出称为原始输入的散列值,或简称散 列值。散列函数之所以在密码学中扮演重要的角色,在于其具有如下的特性单向性已知散列函数的输出,欲求其输入是困难的,即已知c = Hash(m),求m是 困难的。m代表原始输入数据,c为该输出的散列值,Hash ()表示散列函数。Hash(m)表示 对原始数据m进行散列计算。快速性已知m,计算Hash (m)是容易的。Hash函数不属于强计算密集型算法。抗碰撞性已知cl = Hash (ml),知道cl的值,而ml (原始输入数据)的值不知。 构造一个输入数据m2使cl = Hash(m2)是困难的(指计算不可行)。雪崩性若c = Hash (m),那么c的每一比特都与m的每一比特有关,并有高度敏 感性即每改变的一比特,都将对c产生明显影响(比如导致c中一半以上的位发生变化)。接受的输入数据m没有长度限制,对输入任何长度的数据都能够生成固定长度的 输出。有统计计算表明,如Hash (m)的长度为128位时,则任意两个分别为ml和m2的输 入数据具有完全相同Hash (m)的概率为10_24即接近于零的重复概率。若Hash (m)为512位 乃至1024位,则更是不大可能重复了。因此,散列函数可以用于数据完整性验证、数字签名、生成随机数等多种目的。目 前,常用的散列函数主要是MD5,SHA-1, SHA-2等。现存的数据完整性验证方法依赖于散列树结构,如Merkle树, PAT (Parallelizable Authentication Tree)禾口 TEC-Tree (Tamper-Evident CounterTree)。其中,PAT与TEC-tree是基于Merkle树的两种改进型。Merkle 散列树验证思想在文献(Jose L. Munoz, Jordi Forne, OscarEsparza, Man el Rey. Efficient Certificate Revocation System Implementation:Huffman Merkle Hash Tree. Trust, Privacy and Security in Digital Business. Berlin Springer-Verlag, 2005, 3592 :119-127)中被详细阐述,给定一组数据 Y = Yl,Y2.......Yn,现在需要对这组数据进行完整性验证证。为了验证Yi (l^i^ n),一棵二叉
树被构造,该二叉树被称之为Merkle散列树。如图1所示,节点8,9,10,11,12,13,14属于 同一层,即叶节点层,也就是最低层。节点4,5,6,7属于同一层,节点2,3属于同一层。节 点1,即根节点,单独属于一层。二叉树中的每个节点从根节点开始以层遍历的方式被编号, 即同一层被编号完才对下一层进行编号,根节点为节点1,任何中间节点i的子节点为节点 2i和节点2i+l。同时,节点i称为节点2i和节点2i+l的父节点。同一层中具有同一个父 节点的节点称为彼此的兄弟节点,如节点8是节点9的兄弟节点,节点9也称为节点8的兄 弟节点。二叉树中的每个节点都有一个散列函数值与之对应,叶节点的散列函数值是对需 要认证的数据进行散列运算得到的,而中间节点的散列函数值由其子节点的散列函数值联 合进行散列运算得到。二叉树构造过程如下首先计算叶节点的值。叶节点的值由Yi的值得到。如图1所示,c8 = Hash (Y1), c9 = Hash (Y2)等。然后计算中间节点及根节点i的值由节点2i和节点2i+l的值得到。如,c4 = Hash(c8,c9), (c8,c9)表示把数据c9放在c8的后面,两者连接成一个数据。c5 = Hash(c 10,c 11),c 1 = Hash(c2, c3)。由二叉树节点对应的值的构造过程可知,节点1的值与整棵二叉树的每个叶子节 点的值都是相关联的。中间节点i的值与以节点i为根的子树的所有叶节点对应的值有关。 如节点2的值与节点4,5,8,9,10,11对应的值有关。这种方法能够提高处理器的安全性。但是这种方法产生的散列树层数、节点较 多,缺失代价大,验证时资源开销也较大,因此不能够满足嵌入式系统应用的要求。PAT与 TEC-tree是对Merkle树的节点值进行了改进,但是没有对Merkle树本身进行改进,因此两 者产生的节点也较多,同样有缺失代价、验证时资源开销大的缺点。

发明内容
本发明的目的在于提供一种适用于嵌入式处理器的数据完整性验证方法,该方法 与现有技术相比具有更小的硬件开销,却能达到更优的性能,能够真正应用于对设计要求 较高的嵌入式系统中。本发明提供的一种适用于嵌入式处理器的数据完整性验证方法,包括初始化操作 过程中的数据完整性验证及读、写操作过程中的数据完整性验证;其特征在于,初始化操作过程中的数据完整性验证包括下述步骤(A1)计算待建立的多粒度散列树的层数;(A2)对物理内存中数据块进行散列计算,按照步骤(A1)中计算的层数建立多粒 度散列树,并将多粒度散列树存储在散列缓存中;(A3)从可信存储区读取安全信息,并与多粒度散列树的根节点的值进行比较,如 果两者相等,说明内存中的数据未遭篡改,则将验证标志位置为1 ;两者不等,则置标志位 为0,表示内存中的数据已遭篡改;读操作过程的数据完整性验证过程为(B1)计算物理内存中两个相邻数据块的散列值;(B2)在散列缓存中查找是否有与步骤(B1)所述的两个相邻数据块的相应叶节点的值,如果有,进入步骤(B3),否则,该相应叶节点缺失,称之为当前缺失节点,用步骤(B1) 中计算出的散列值代替当前缺失节点值,然后转入步骤(B4);(B3)读散列缓存中相应叶节点的值,并与步骤(B1)中计算出的散列值进行比较, 若两值相等,说明数据块是完整的,则将验证标志位置为1,否则,将验证标志位置为0,表 示数据块不是完整的;最后均进入步骤(B9);(B4)对当前缺失节点按照下面过程进行处理(B41)在散列缓存中查找当前缺失节点的兄弟节点,如果兄弟节点的值缺失,称该 兄弟节点为当前缺失节点,进入步骤(B42),否则,进入步骤(B5);(B42)处理步骤如下(B421)判断当前缺失节点是否为叶节点,如果是,则由缺失节点对应的物理内存 中数据块计算出散列值,用计算出的散列值代替当前缺失节点值,然后进入步骤(B422); 如果不是,直接转入步骤(B422);(B422)计算当前缺失节点的子节点的地址;(B423)在散列缓存中查找是否有当前缺失节点的子节点的值,若所有子节点都 不缺失,则由子节点的值计算出散列值,并用该散列值代替缺失节点的值,然后进入步骤 (B5);若有子节点缺失,则称缺失的子节点为当前缺失节点,然后转入步骤(B42);(B5)判断是否所有的兄弟节点都被查找到了,如果是,则进入步骤(B6),否则跳 到步骤(B41);(B6)读出步骤(B4)中当前缺失节点的兄弟节点的散列值并计算父节点的散列 值;(B7)在散列缓存中查找是否有父节点的值;如果父节点的值缺失,则称该父节点 为当前缺失节点,转入步骤(B8);否则,读出父节点的值,并跳到(B9);(B8)判断步骤(B6)中的当前缺失节点是否为根节点;如果不是,用步骤(B6)中 计算出的散列值代替当前缺失节点值,然后转入步骤(B4);如果是,则从可信存储区中读 出根节点的值,用之代替父节点的值,然后进入步骤(B9);(B9)比较读出的父节点值和步骤(B6)中计算出的父节点值;若两值相等,说明 数据块是完整的,则将验证标志位置为1 ;否则,将验证标志位置为0,表示数据块不是完整 的;(B10)读操作验证过程结束;写操作过程的数据完整性验证过程为(C1)计算待改写数据块对应的散列节点的地址,该散列节点称之为当前缺失节点。(C2)在散列缓存中查找是否有当前缺失节点的值;如果有,则转入步骤(C3);如 果没有,则计算待改写的数据块的散列值,并用该散列值代替当前节点值,然后进入步骤 (C3);(C3)查找该当前缺失节点兄弟节点;如果兄弟节点缺失,则称缺失的兄弟节点为 当前缺失节点,进入步骤(C4);如果不缺失,则进入步骤(C5);(C4)处理步骤如下(C41)判断当前缺失节点是否为叶节点,如果不是,转入步骤(C42);如果是,则由缺失节点对应的物理内存中数据块计算出散列值,并用计算出的散列值代替当前缺失节点 值,然后进入步骤(C5);(C42)计算当前缺失节点的子节点的地址;(C43)在散列缓存中查找是否有当前缺失节点的子节点的值,若所有子节点都 不缺失,则由子节点的值计算出散列值,并用该散列值代替缺失节点的值,然后进入步骤 (C5);若有子节点缺失,则称缺失的子节点为当前缺失节点,然后转入步骤(C4);(C5)判断是否步骤(C3)所有的兄弟节点都被查找到了,如果是,则进入步骤 (C6),否则跳到步骤(C3);(C6)读步骤(C3)中第一个当前缺失节点及其兄弟节点的散列值并计算它们的父 节点的散列值;(C7)在散列缓存中查找是否有父节点的值;如果父节点的值缺失,则称该节点为 当前缺失节点,转入步骤(C8);否则,读出父节点的值,并跳到(C9);(C8)判断步骤(C7)中的当前缺失节点是否为根节点;如果不是,用步骤(C6)中 计算出的散列值代替当前缺失节点的值,然后转入步骤(C3);如果是,则从可信存储区中 读出根节点的值,用之代替父节点的值,然后进入步骤(C9);(C9)比较读出的父节点值和步骤(C6)中计算出的父节点值;若两值相等,说明数 据块是完整的,则将验证标志位置为1,然后转入步骤(C10);否则,将验证标志位置为0,表 示数据块不是完整的,跳到(C11);(C10)更新当前节点和它的父节点值;(C11)写操作验证过程结束。本发明提供了一种适用于嵌入式处理器的数据完整性验证方法,它包括多粒度散 列计算和散列访问控制,其中散列访问控制包括地址的转换,散列节点的访问。多粒度散列 计算用于产生多粒度Merkle树,该树缓存在散列cache中,同时在树的节点缺失时,此算法 负责计算内存中数据块的散列值。地址转换为每个节点提供了一个唯一对应的地址。散列 节点访问主要负责访问各个散列树的节点,特别是在读缺失和写操作时采取不同的对策。 读缺失时,首先访问子节点,计算出当前节点,再递归地追踪父节点。在执行写操作时,先验 证当前节点的安全性。再更新当前节点和父节点。由于采用多粒度散列算法,本发明产生 的散列树节点少,层数少,因而减少了存储空间,硬件面积开销和初始化时间,提高了性能。本发明针对自然Merkle树的缺点,采用了多粒度算法,即对不同层的节点采用不 同的粒度(用来进行散列运算的数据块的数目称为粒度)进行散列计算。对于Merkle树 来说,低层节点特别是叶节点,访问得最频繁。所以,我们对这些节点使用较少数目的数据 块(即较小的粒度)进行散列计算,我们称之为细粒度散列算法。与此同时,对于拥有大缺 失代价的高层节点,我们使用较多数据块来进行散列计算,我们称之为粗粒度散列算法。细 粒度散列算法通过使散列开销最小化来提高存储器校验的性能,而粗粒度散列算法通过一 次对多个节点进行散列计算来节省存储空间,增大了高层节点的命中率。


图1为Merkle散列树的示意图;图2为本发明提供的数据完整性校验方法的结构模型示意图3为本发明提供的方法的内部结构及数据流向示意图;图4为本发明的多粒度Merkle树结构示意图,其中,(a)为自然Merkle树,(b)为 多粒度Merkle树;图5为本发明的节点地址转换算法示意图;图6为本发明的粒度索引示意图;图7为本发明的初始化操作流程;图8为本发明的多粒度Merkle节点计算示意图;图9为本发明的读操作验证流程;图10为本发明的写操作验证流程;
具体实施例方式下面结合附图和实例对本发明作进一步详细的说明。图2为本发明提供的数据完整性校验方法在处理器整体架构中位置的示意图,即 实现此方法需要在现有的处理器中额外增加一个完整性验证模块。图2中非可信存储区是 指处理器芯片外部的存储器,可信存储区是指处理器芯片内部的存储器。如图3所示,完整性验证模块中引入了一个高速缓冲存储器,用于存储散列树的 节点值,下称散列缓存。此外,完整性验证模块还包括两大部分,分别为多粒度散列计算模 块和散列访问控制模块。多粒度散列计算模块,是实现散列函数的电路模块,主要功能是对 不同粒度的(即不同个数的)数据块进行散列计算,得到一个具有固定位数的散列值。对 于写操作(即把第二级高速缓冲存储器中的数据写入非可信存储区),在执行这一操作之 前,待写的数据要先流入散列计算模块,得到散列值,然后用此值更新散列cache中相应的 节点散列值。对于读操作,非可信区的数据在读入第二级高速缓冲存储器之前,待写的数据 先要流入散列计算模块,计算出的散列值与从散列cache中取出的值进行比较,两值相等 则非可信区的数据可以读入第二级高速缓冲存储器,不相等则说明数据已遭篡改,不可以 读入第二级高速缓冲存储器。图4表示的是一个2元(2-ary)的多粒度散列树和一个自然Merkle树的对比。 第三层是多粒度Merkle树的叶节点。它的粒度固定为2。第二层定义为多粒度Merkle树 的基本层。它的粒度可以被配置为2,那么这时候它就是2-ary的多粒度Merkle树。多粒 度Merkle树的粒度从这层开始变化。上一层的粒度由下层的粒度乘二得到。所以第1层 的散列粒度为4,第零层的粒度为8。采用这样的方式,对于一个总层数为j的Merkle树, 第i层的粒度为A” A, = Abasi。X2j-H (Abasic为基本层的粒度)。多粒度Merkle树的上层节 点拥有粗散列粒度,这使得一个上层节点能够验证更多的下层节点。这不仅节省了散列树 的存储空间,还减少了加载程序时的初始化延迟。如图5所示,对于叶层的节点,层数为i,它的地址是将相应的存储器地址右移 logA位队是第i层的粒度),最左端位空位用0补足。同样地,将节点地址右移 Io^Ah位能够得到它在第i_l层的父节点地址。通过这种移位操作,散列访问控制模块能 够快速地计算出从i层到0层(散列树的最高层)的散列节点的地址。每个散列树的节点 对应唯——个地址。如图6所示,该结构使得散列cache可以通过索引一个节点的层数,快速取得该节点的粒度。此外,为了利用cache结构,被访问节点的地址映射成三个字段标签,cache地 址,字节偏移量。这简化了访问节点的搜索。本发明方法包括散列树初始化操作过程中的数据完整性验证及读写操作过程中 的数据完整性验证。下面分别予以具体说明。为了使强制缺失最小化,必须在验证数据完整性之前初始化Merkle树。由于数据 是从片外存储器上载入的,所以多粒度散列计算模块计算每两个数据块的散列值,这些散 列值称为叶节点,以这些叶节点值按照不同的粒度算出上层节点的散列值,重复计算上层 节点的散列值,最终算出根节点的散列值,至此,构造散列树的工作就结束了。散列计算的 最终结果被称作根节点,需要与安全信息进行比较,该安全信息在初始化操作前已经存入 可信区。如果根节点与安全信息一致,说明被访问的数据是安全的,没有被篡改。否则,就 意味着非可信存储区遭到篡改攻击,数据的完整性被破坏。初始化完成后,部分散列树节点 存储在散列缓存中,供运行期间的读写非可信存储区验证使用。如图7所示,初始化操作过程中的数据完整性验证包括下述步骤(A1)计算多粒度散列树的层数。设i表示层的序号,j表示总层数,i的取值范围为0至j_l,其中,第0层表示 根节点层,Abasic表示预先设定的基本层的粒度(通常取值为2和4),根据粒度关系Ai =
以及待散列计算的数据块的块数,计算出多粒度散列树的层数j。如图4,有 128块数据,叶节点层和基本层的粒度为2,往上的层的粒度分别为4、8、16,32等等,用128 分别除以这些粒度,结果为1时即结束,此时所作的除法的次数就是层数。对于128块数 据,128 + 2 + 2 + 4 + 8 = 1,即总层数为4。对于129块数据,129 + 2 + 2 + 4 + 8 = 1余1,则 总层数为5,即对于无法整除的数,总层数为所作除法次数加1。(A2)对物理内存(即图2中的非可信存储区)中数据块进行散列计算,建立散列 树,并将散列树存储在散列缓存中。如图8所示,假设物理内存中的数据为Y1,Y2,......Y16,节点6,7,8,9......,13
为叶节点,具体计算步骤如下(A21)以2为粒度,计算叶节点的散列值。如图8所示,叶节点6的值为c6 = Hash(Yl,Y2),cn表示节点n的散列值,n为一 个大于1的整数,则c6表示节点6的散列值。HashO表示采用一种散列函数对括号内的数 进行散列计算,在本方法中,任取现有的一种散列函数即可。(P,q)表示把数P与数q首尾 相连成一个数,若 P = 10001,q = 0011,则(p,q) = 100010011,则 c6 = Hash (100010011)。 同样,c7 = Hash (Y3, Y4),c8 = Hash (Y5, Y6),c9 = Hash (Y7, Y8),以此类推。每计算出一 个散列值,就存储在散列缓存中,以供计算上一层节点的散列值使用,在步骤(A22),(A23) 中,这点同样适用;(A22)同样以2为粒度(也可以取4或8为粒度,这可以人为地确定,但根据作者 的研究发现,取2或4的时候性能会更好),计算基本层节点的散列值;如图8所示,计算基本层节点2,3,4,5的散列值,c2 = Hash(c6, c7), c3 = Hash(c8, c9),c4 = Hash(cl0, ell),c5 = Hash(c12, cl3);(A23)从基本层开始,以下一层节点的粒度,乘2得出上一层节点的粒度,并以计 算出的粒度,计算上一层节点的散列值,重复这一操作,直至计算出最高层中根节点的散列值;如图8所示,基本层的上一层为层0,则用基本层粒度乘以2得出层0的粒度为4, 因此,节点值 cl = Hash(c2,c3,c4,c5)。(c2,c3,c4,c5)表示把 c2,c3,c4,c5 四个数首 尾相连。在这一例子中,到这里散列树就已经建立完成了,节点1就是根节点。对于那些数 据块多于16的,在这一步没有到达最后一层,重复乘2算上一层粒度,计算散列值这一步 骤,直至到达最后一层;(A3)读取安全信息,并与根节点进行比较。从处理器内的可信存储区中读出安全信息,并将之与上一步骤计算出的根节点散 列值cl进行比较。若两者相等,说明内存中的数据未遭篡改,则将验证标志位置为1 ;若两 者不等,则置标志位为0,表示内存中的数据已遭篡改。如图9所示,读操作过程的数据完整性验证过程包括下列步骤(B1)计算物理内存中两个相邻数据块的散列值;散列值由多粒度散列计算模块计算而得,散列值为c = Hash(Yi,Yi+1)。Yi,Yi+1表 示物理内存中两个相邻的数据块。(B2)在散列缓存中查找是否有与步骤(B1)所述的两个相邻数据块的相应叶节点 的值,如果有,进入步骤(B3),否则,该相应叶节点缺失,称之为当前缺失节点,用步骤(B1) 中计算出的散列值代替当前缺失节点值,然后转入步骤(B4);查找过程为设两个相邻数据块中的任意一个数据块的编号为s,该数据块为Ys, 其地址为adds,则相应叶节点的地址Addk由adds右移log2Ni位得到,Ni是层i的粒度, 移位后,最左端的log2Ni位空位由0来补足,k为叶节点的编号,根据叶节点的地址Addk, 查找散列缓存相应叶节点的值。用步骤(B1)中计算出的散列值代替当前缺失节点值,是指将上一步骤计算出的c 写入散列缓存的地址Addk中。(B3)读散列缓存中相应叶节点的值,并与步骤(B1)中计算出的散列值进行比较, 若两值相等,说明数据块是完整的,则将验证标志位置为1,否则,将验证标志位置为0,表 示数据块不是完整的;最后均进入步骤(B9);(B4)对当前缺失节点按照下面过程进行处理(B41)查找当前缺失节点的兄弟节点,如果兄弟节点的值缺失,称该兄弟节点为当 前缺失节点,进入步骤(B42),否则,进入步骤(B5);查找过程为设当前缺失节点的地址为adds,则当前缺失节点的基本地址Adds由 adds右移log2Ni位,然后再左移log2Ni位得到,Ni是当前缺失节点所在层i_l的上一层i 的粒度,移位后,最右端的log2Ni位空位由0来补足。Adds,Adds+l,……,Adds+(Ni-l)中 包括当前缺失节点地址,去掉该地址,剩余的Ni-2个地址即为缺失节点的兄弟节点地址。 根据兄弟节点的地址,查找散列缓存中相应兄弟节点的值。(B42)处理步骤如下(B421)判断当前缺失节点是否为叶节点,如果是,则由缺失节点对应的物理内存 中数据块计算出散列值,用计算出的散列值代替当前缺失节点值,转入步骤(B5)。如果不 是,转入步骤(B422);初始化过程中,已经计算出了总层数j,如果当前缺失节点所在的层数i等于j_l,则缺失节点是叶节点。否则,当前缺失节点不是叶节点。如果当前缺失节点为叶节点,且地址为add,则缺失节点对应的物理内存中数据块 的基本地址为Addb,Addb由add左移lo&2位得到,最右端的lo&2位空位用0补足,Addb, Addb+1是缺失节点对应的物理内存中的两个数据块的地址。假设读出地址Addb,Addb+1 中的数据为Yi,Yi+1,则计算出的散列值为c = Hash(t,Yi+1),然后将c写入散列缓存的地址 add 中。(B422)计算当前缺失节点的子节点的地址;
设缺失节点的地址为Add,则子节点的基本地址Addb由Add左移log2Ni位 (Ni是当前节点层的粒度),移动后,最右端的log2Ni位空位用0补足。Add,Add+1, Add+2,......Add+(Ni-l),就是所有子节点的地址;(B423)在散列缓存中查找是否有当前缺失节点的子节点的值,若所有子节点都 不缺失,则由子节点的值计算出散列值,并用该散列值代替缺失节点的值,然后进入步骤 (B5)。若有子节点缺失,则称缺失的子节点为当前缺失节点,然后转入步骤(B42);按照步骤(B422)计算出的地址去散列缓存中查找相应的子节点散列值。如果 所有子节点都不缺失,则按照步骤(B422)计算出的子节点地址读出所有子节点的散列 值,假设读出的子节点散列值为,cl,c2, c3……,cNi,则由子节点的值计算出散列值c = Hash(cl, c2, c3……,cNi),然后将计算出的散列值写到散列缓存的地址Add中。(B5)判断是否所有的兄弟节点都被查找过了,如果是,则进入步骤(B6),否则跳 到步骤(B41);设置一个计数器,每进入步骤(B41) —次,计数器加一,若计数器的结果counter 等于步骤(B41)中的Ni减一,则说明所有的兄弟节点都被查找过了。若不相等,则说明还 有兄弟节点未查找过。(B6)读出步骤(B4)中当前缺失节点及其兄弟节点的散列值并计算父节点的散列 值;设读出的当前缺失节点及其兄弟节点的散列值分别为cl,c2,c3,c4……,ci,则计 算父节点的散列值为:Hash(cl, c2, c3, c4……,ci)。(B7)在散列缓存中查找是否有父节点的值。如果父节点的值缺失,则称该父节点 为当前缺失节点,转入步骤(B8);否则,读出父节点的值,并跳到(B9);查找过程设当前缺失节点的地址为Add,则父节点的地址Addf由Add右移lo&Ni 位(Ni是父节点所在层的粒度)得到,最左端log2Ni位用0补足。根据父节点的地址,查 找散列缓存父节点的值。(B8)判断步骤(B7)中的当前缺失节点是否为根节点。如果不是,用步骤(B6)中 计算出的散列值代替当前缺失节点值,然后转入步骤(B4);如果是,则从可信存储区中读 出根节点的值,用之代替父节点的值;如果当前缺失节点所在的层数i等于0,则缺失节点是根节点。否则,当前缺失节 点不是根节点。(B9)比较读出的父节点值和步骤(B6)中计算出的父节点值。若两值相等,说明 数据块是完整的,则将验证标志位置为1。否则,将验证标志位置为0,表示数据块不是完整 的;
11
这里的读出的父节点值,可能是步骤(B7)中读出的父节点值,也可能是步骤(B8) 中从可信存储区中读出的根节点值。(B10)读操作验证过程结束;如图10所示,写操作过程的数据完整性验证过程包括下列步骤(C1)计算待改写数据块对应的散列节点(称之为当前缺失节点)的地址;设待改写数据块的地址为adds,则当前缺失节点的地址Add由adds右移log2Ni 位得到,Ni是层i的粒度,移位后,最左端的log2Ni位空位由0来补足。(C2)在散列缓存中查找是否有当前缺失节点的值。如果有,则直接转入步骤 (C3);如果没有,先计算待改写的数据块的散列值,再用该散列值代替当前节点值,然后进 入步骤(C3);根据步骤(C1)计算出的当前缺失节点的地址Addk,查找散列缓存中当前缺失节 点的值。如果散列缓存中没有当前缺失节点的值,则由步骤(C1)中数据块地址adds右移 一位,再向左移一位,最右端一位用0补足,得到数据块的基本地址addb,读取物理内存地 址addb,addb+l中的值Yi,Yi+1计算散列值c = Hash Yi+1),将c写入散列缓存地址Addk 中。(C3)查找该当前缺失节点兄弟节点。如果兄弟节点缺失,则称缺失的兄弟节点为 当前缺失节点,进入步骤(C4);如果不缺失,则进入步骤(C5);查找过程为设当前缺失节点的地址为adds,则当前缺失节点的基本地址Adds由 adds右移log2Ni位,然后再左移log2Ni位得到,Ni是当前缺失节点所在层i_l的上一层i 的粒度,移位后,最右端的log2Ni位空位由0来补足。Adds,Adds+l,……,Adds+(Ni-l)中 包括当前缺失节点地址,去掉该地址,剩余的Ni-2个地址即为缺失节点的兄弟节点地址。 根据兄弟节点的地址,查找散列缓存相应兄弟节点的值。(C4)处理步骤如下(C41)判断当前缺失节点是否为叶节点,如果不是,转入步骤(C42);如果是,则由 缺失节点对应的物理内存中数据块计算出散列值,并用计算出的散列值代替当前缺失节点 值,然后进入步骤(C5);初始化过程中,已经计算出了总层数j,如果当前缺失节点所在的层数i等于j_l, 则缺失节点是叶节点。否则,当前缺失节点不是叶节点。如果当前缺失节点为叶节点,且地址为add,则缺失节点对应的物理内存中数据块 的基本地址为Addb,Addb由add左移lo&2位得到,最右端的lo&2位空位用0补足,Addb, Addb+1是缺失节点对应的物理内存中的两个数据块的地址。假设读出地址Addb,Addb+1 中的数据为Yi,Yi+1,则计算出的散列值为c = Hash(t,Yi+1),然后将c写入散列缓存的地址 add 中。(C42)计算当前缺失节点的子节点的地址;设缺失节点的地址为Add,则子节点的基本地址Addb由Add左移log2Ni 位(Ni是当前节点层的粒度),移动后,最的低位log2Ni用0补足。Add,Add+1, Add+2,......Add+(Ni-l),就是所有子节点的地址;(C43)在散列缓存中查找是否有当前缺失节点的子节点的值,若所有子节点都不缺失,则由子节点的值计算出散列值,并用该散列值代替缺失节点的值。若有子节点缺失, 则称缺失的子节点为当前缺失节点,然后转入步骤(C4);按照步骤(C42)计算出的地址去散列缓存中查找相应的子节点散列值。如果所有 子节点都不缺失,则按照步骤(C42)计算出的子节点地址读出所有子节点的散列值,假设 读出的子节点散列值为,cl,c2, c3……,cNi,则由子节点的值计算出散列值c = Hash(cl, c2,c3……,cNi),然后将计算出的散列值写到步骤(B422)中当前缺失节点的地址Add中。(C5)判断是否步骤(C3)所有的兄弟节点都被查找到了,如果是,则进入步骤 (C6),否则跳到步骤(C3);设置一个计数器,每进入步骤(C3) —次,计数器加一,若计数器的结果counter, 等于步骤(C3)中的Ni减一,则说明所有的兄弟节点都被查找过了。若不相等,则说明还有 兄弟节点未被查找过。(C6)读步骤(C3)中第一个当前缺失节点的及其兄弟节点的散列值并计算它们的 父节点的散列值;设读出的当前缺失节点及其兄弟节点的值分别为cl,c2,c3,c4……,ci,则计算父 节点的散列值为:Hash(cl, c2,c3,c4……,ci)。(C7)在散列缓存中查找是否有父节点的值。如果父节点的值缺失,则称该节点为 当前缺失节点,转入步骤(C8);否则,读出父节点的值,并跳到(C9);查找过程设当前缺失节点的地址为Add,则父节点的地址Addf由Add右移lo&Ni 位(Ni是父节点所在层的粒度)得到,最左端log2Ni位用0补足。根据父节点的地址,查 找散列缓存父节点的值。(C8)判断步骤(C7)中的当前缺失节点是否为根节点。如果不是,用步骤(C6)中 计算出的散列值代替当前缺失节点的值,然后转入步骤(C3);如果是,则从可信存储区中 读出根节点的值,用之代替父节点的值;如果当前缺失节点所在的层数i等于0,则缺失节点是根节点。否则,当前缺失节 点不是根节点。(C9)比较读出的父节点值和步骤(C6)中计算出的父节点值。若两值相等,说明数 据块是完整的,则将验证标志位置为1,然后转入步骤(C10)。否则,将验证标志位置为0,表 示数据块不是完整的,跳到(C11);这里的读出的父节点值,可能是步骤(C7)中读出的父节点值,也可能是步骤(C8) 中从可信存储区中读出的根节点值。(C10)更新当前节点和它的父节点值;更新当前节点,即是由即将写入非可信存储区中的数据计算出散列值,然后将该 散列值写入步骤(C1)中计算出的地址中。更新父节点,即是由更新的当前节点及其兄弟节 点计算出他们的父节点的散列值,然后将新父节点散列值写入散列缓存中。(C11)写操作验证过程结束;使用这种验证算法,能够有效的发现被篡改的数据并发现被破坏的程序。此外,用 来检查根节点的关键安全信息存储在片内存储器中的。节点的散列值只有初始化或是散列 节点缺失时才被缓存和计算。所以,多粒度Merkle树不需要额外的存储空间来保存散列 值。这不仅减少了硬件开销,还改善了嵌入式处理器的安全性。
此外,本方法使处理器能够把散列计算的时间隐藏在内存的访问过程中。这就有 效地减少了多粒度Merkle树安全计算的性能开销。对本发明采用Mibench进行性能测试,由实验结果可以看到,本发明所提出的多 粒度Merkle树相比自然Merkle树具有性能上的优越性,更适用于嵌入式系统。本发明不应该局限于附图所公开的内容。所以凡是不脱离本发明所公开的精神下 完成的等效或修改,都落入本发明保护的范围。
权利要求
一种适用于嵌入式处理器的数据完整性验证方法,包括初始化操作过程中的数据完整性验证及读、写操作过程中的数据完整性验证;其特征在于,初始化操作过程中的数据完整性验证包括下述步骤(A1)计算待建立的多粒度散列树的层数;(A2)对物理内存中数据块进行散列计算,按照步骤(A1)中计算的层数建立多粒度散列树,并将多粒度散列树存储在散列缓存中;(A3)从可信存储区读取安全信息,并与多粒度散列树的根节点的值进行比较,如果两者相等,说明内存中的数据未遭篡改,则将验证标志位置为1;两者不等,则置标志位为0,表示内存中的数据已遭篡改;读操作过程的数据完整性验证过程为(B1)计算物理内存中两个相邻数据块的散列值;(B2)在散列缓存中查找是否有与步骤(B1)所述的两个相邻数据块的相应叶节点的值,如果有,进入步骤(B3),否则,该相应叶节点缺失,称之为当前缺失节点,用步骤(B1)中计算出的散列值代替当前缺失节点值,然后转入步骤(B4);(B3)读散列缓存中相应叶节点的值,并与步骤(B1)中计算出的散列值进行比较,若两值相等,说明数据块是完整的,则将验证标志位置为1,否则,将验证标志位置为0,表示数据块不是完整的;最后均进入步骤(B9);(B4)对当前缺失节点按照下面过程进行处理(B41)在散列缓存中查找当前缺失节点的兄弟节点,如果兄弟节点的值缺失,称该兄弟节点为当前缺失节点,进入步骤(B42),否则,进入步骤(B5);(B42)处理步骤如下(B421)判断当前缺失节点是否为叶节点,如果是,则由缺失节点对应的物理内存中数据块计算出散列值,用计算出的散列值代替当前缺失节点值,然后进入步骤(B422);如果不是,直接转入步骤(B422);(B422)计算当前缺失节点的子节点的地址;(B423)在散列缓存中查找是否有当前缺失节点的子节点的值,若所有子节点都不缺失,则由子节点的值计算出散列值,并用该散列值代替缺失节点的值,然后进入步骤(B5);若有子节点缺失,则称缺失的子节点为当前缺失节点,然后转入步骤(B42);(B5)判断是否所有的兄弟节点都被查找到了,如果是,则进入步骤(B6),否则跳到步骤(B41);(B6)读出步骤(B4)中当前缺失节点的兄弟节点的散列值并计算父节点的散列值;(B7)在散列缓存中查找是否有父节点的值;如果父节点的值缺失,则称该父节点为当前缺失节点,转入步骤(B8);否则,读出父节点的值,并跳到(B9);(B8)判断步骤(B6)中的当前缺失节点是否为根节点;如果不是,用步骤(B6)中计算出的散列值代替当前缺失节点值,然后转入步骤(B4);如果是,则从可信存储区中读出根节点的值,用之代替父节点的值,然后进入步骤(B9);(B9)比较读出的父节点值和步骤(B6)中计算出的父节点值;若两值相等,说明数据块是完整的,则将验证标志位置为1;否则,将验证标志位置为0,表示数据块不是完整的;(B10)读操作验证过程结束;写操作过程的数据完整性验证过程为(C1)计算待改写数据块对应的散列节点的地址,该散列节点称之为当前缺失节点;(C2)在散列缓存中查找是否有当前缺失节点的值;如果有,则转入步骤(C3);如果没有,则计算待改写的数据块的散列值,并用该散列值代替当前节点值,然后进入步骤(C3);(C3)查找该当前缺失节点兄弟节点;如果兄弟节点缺失,则称缺失的兄弟节点为当前缺失节点,进入步骤(C4);如果不缺失,则进入步骤(C5);(C4)处理步骤如下(C41)判断当前缺失节点是否为叶节点,如果不是,转入步骤(C42);如果是,则由缺失节点对应的物理内存中数据块计算出散列值,并用计算出的散列值代替当前缺失节点值,然后进入步骤(C5);(C42)计算当前缺失节点的子节点的地址;(C43)在散列缓存中查找是否有当前缺失节点的子节点的值,若所有子节点都不缺失,则由子节点的值计算出散列值,并用该散列值代替缺失节点的值,然后进入步骤(C5);若有子节点缺失,则称缺失的子节点为当前缺失节点,然后转入步骤(C4);(C5)判断是否步骤(C3)所有的兄弟节点都被查找到了,如果是,则进入步骤(C6),否则跳到步骤(C3);(C6)读步骤(C3)中第一个当前缺失节点及其兄弟节点的散列值并计算它们的父节点的散列值;(C7)在散列缓存中查找是否有父节点的值;如果父节点的值缺失,则称该节点为当前缺失节点,转入步骤(C8);否则,读出父节点的值,并跳到(C9);(C8)判断步骤(C7)中的当前缺失节点是否为根节点;如果不是,用步骤(C6)中计算出的散列值代替当前缺失节点的值,然后转入步骤(C3);如果是,则从可信存储区中读出根节点的值,用之代替父节点的值,然后进入步骤(C9);(C9)比较读出的父节点值和步骤(C6)中计算出的父节点值;若两值相等,说明数据块是完整的,则将验证标志位置为1,然后转入步骤(C10);否则,将验证标志位置为0,表示数据块不是完整的,跳到(C11);(C10)更新当前节点和它的父节点值;(C11)写操作验证过程结束。
2.根据权利要求1所述的方法,其特征在于,步骤(A2)中,建立多粒度散列树的过程 为首先以2为粒度,计算叶节点的散列值,然后同样以2为粒度,计算基本层节点的散列 值,从基本层开始,以下一层节点的粒度,乘2得出上一层节点的粒度,并以计算出的粒度, 计算上一层节点的散列值,重复这一操作,直至计算出根节点的值。
3.根据权利要求1所述的方法,其特征在于,步骤(B2)中,查找过程为设二个相邻数 据块中的一个数据块的编号为s,该数据块为Ys,其地址为adds,则相应叶节点的地址Addk 由adds右移log2Ni位得到,Ni是层i的粒度,移位后,最左端的空位由0来补足,k为叶节 点的编号,根据叶节点的地址Addk,查找散列缓存相应叶节点的值。
全文摘要
本发明公开了一种适用于嵌入式处理器的数据完整性验证方法,它包括多粒度散列计算方法,地址转换方法以及散列节点访问控制方法。多粒度散列计算方法用于产生多粒度Merkle树,该树缓存在散列cache中,同时在树的节点缺失时,此算法负责计算内存中数据块的散列值。地址转换方法为每个节点提供了一个唯一对应的地址。散列节点访问控制方法主要负责访问各个散列树的节点,特别是在读缺失和写操作时采取不同的对策。由于采用多粒度散列算法,本发明产生的散列树节点少,层数少,因而减少了存储空间,硬件面积开销和初始化时间,提高了性能。
文档编号G06F11/00GK101853190SQ20101019155
公开日2010年10月6日 申请日期2010年6月4日 优先权日2010年6月4日
发明者刘政林, 郭超, 陈天山, 霍文捷 申请人:华中科技大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1