用于增量代码签署的方法和装置的制作方法

文档序号:7607327阅读:109来源:国知局
专利名称:用于增量代码签署的方法和装置的制作方法
技术领域
本发明涉及计算机安全领域,特别是,本发明公开了一种用于证实未经授权方没有篡改计算机程序代码的系统。
背景技术
计算机安全是计算机软件生产商所面临的最迫切的问题之一。随着因特网的普及浪潮的兴起,几乎每一个个人计算机系统都在这一点或那一点上联网。这种巨大的连接能力已经给个人计算机带来许多好处。然而,它也已经给计算机用户带来许多新问题。最大的问题之一就是从因特网传送的病毒、蠕虫、特洛伊木马和其它恶意的程序。
恶作剧的计算机编程者,有时被称为“黑客”,经常尝试去侵入计算机系统以便窃取信息或者作出未经授权的改动。黑客使用多种不同类型的攻击,企图侵入计算机系统。计算机黑客使用的一般方法包括特洛伊木马(一种表面上为良性的计算机程序,里面含有隐藏的议程),计算机病毒(一段软件,它能在宿主程序内复制它本身),计算机蠕虫(一段软件,它能在计算机网络上复制它本身),以及社会工程(用授权代码来欺骗人,使其泄露那些已授权的代码)。
这些恶作剧的计算机编程者经常通过添加程序代码来改变现有合法程序以执行未经授权的功能。通过在合法程序内放置这样的已授权程序代码,所述恶作剧的计算机编程者由此将未经授权的程序代码隐藏起来。因此,未经授权的代码能长期驻留在人们的个人计算机系统内而不被人察觉。未经授权的程序代码可以破坏有价值的数据,浪费计算机资源(CPU周期、网络带宽、存储空间等等),或者窃取保密信息。
为了保护合法程序免遭这样的未经授权的搀杂,某些软件制造商生成所述程序代码的校验和。校验和是使用所述程序代码作为输入值而计算出来的值,使得每一个不同的计算机程序都趋向于具有一个不同的校验和值。然后,软件制造商用私钥对校验和进行数字“签署”。在运行所述计算机程序代码之前,用户必须验证所述程序代码。具体地说,用户用软件制造商的公钥对所述程序代码进行解密之后,让个人计算机系统计算所述程序代码的校验和,然后将计算出来的校验和值与软件制造商计算出来的校验和进行比较。如果这两个校验和匹配,则所述计算机程序被认为是真实的。
这些现有的基于校验和的保护系统已经被认为工作得很好。然而,为了验证大型计算机程序,这些现有的基于校验和的保护系统可能要用很长的时间。因此,人们希望提供一种用于验证大型计算机程序的更快的系统。

发明内容
本发明公开了一种用于快速地和容易地验证大型计算机程序的方法。本方法是这样运行的首先以增量方式用数字签名来加封计算机程序。具体地说,所述计算机程序被分为一组程序块,并且为每一个程序块计算一个散列值。所述散列值的集合被形成为一个散列值阵列,然后用数字签名来加封所述散列值阵列。接着,所述计算机程序连同所述散列值阵列和所述数字签名一起分发。为了验证所述计算机程序,接收者首先通过数字签名和公钥来验证散列值阵列的真实性。一旦所述散列值阵列已经通过验证,接收者随后通过计算待装载的一个程序块的散列值,然后与已验证的散列值阵列中的一个相关散列值进行比较,来验证每一个计算机程序块的真实性。如果这两个散列值不匹配,则可以停止执行。
在随后的实施例和附图所描述和图示的本发明的实施方式中,将达到上述和其它目标。


通过以下的结合附图的详细说明,将使本发明变得易于理解,其中,相同的参考数字表示相同的结构元件,在附图中图1是表示如何用数字签名来加封计算机程序的概念图。
图2是流程图,说明计算机系统在执行所述计算机程序之前,如何验证用数字签名加封的计算机程序。
图3是描述如何使用增量代码签署通过数字签名来加封计算机程序的概念图。
图4是流程图,说明如何使用增量代码签署通过数字签名和散列值阵列来加封计算机程序。
图5是流程图,说明计算机系统如何验证并执行已经通过增量代码签署加封的计算机程序。
具体实施例方式
表示法和术语表在以下的关于本发明的详细说明中,陈述了许多专门的细节,以便提供对本发明的透彻理解。然而,对本领域的技术人员来说,显而易见的是,没有这些专门的细节,也可以实施本发明。在其它实例中,对众所周知的方法、过程、部件和电路不进行详细说明,以避免不必要地使本发明的一些方面变得含糊不清。
下面,本发明的详细说明在很大程度上以过程、步骤、逻辑块、处理和描述被连接到网络的数据处理装置的其它符号表示的形式来提供。这些过程描述和表示是本领域的技术人员用来向本领域的其它技术人员最有效地传递它们的工作内容的方法。下面详细说明的方法和装置是导致所期望的结果的过程或步骤的一个首尾一贯的序列。这些步骤或过程是各种物理量的所需的物理操作。通常,虽然不一定是这样,这些量采取可以被存储、传送、组合、比较、显示以及可以在计算机系统或电子计算装置中进行其它操作的电信号的形式。它证明经常都是方便的,主要地由于通用的原因,把这些信号表示为比特、数值、元素、符号、运算、消息、项、数目等。应当记住,所有这些相似的术语都跟适当的物理量有关,并且是被施加到这些量的仅有的方便的标记。除了像下面的明显描述那样另有说明的情形以外,应当理解,本发明从头到尾都利用诸如“处理”或“计算”或“验证”或“显示”等那样的术语,指的都是一个计算装置的动作和过程,上述计算装置把在所述计算装置的寄存器和存储器中被表示为物理量的数据操作和变换为在所述计算装置或其它电子装置中类似地被表示为各种物理量的其它数据。
采用数字签名的计算机程序安全为了保护计算机程序免遭未经授权的篡改,软件制造商可以为计算机程序生成一种特殊的“封条”,在程序被执行之前,必须对所述封条进行测试。如果所述封条或计算机程序代码已经被篡改,则测试将失败,从而拒绝执行所述程序。
生成这样一种封条的通用方法就是使用众所周知的“公钥”加密技术。下面将参照图1和2来说明使用公钥加密技术的这样一个系统。
数字加封计算机程序现在参照附图,在所有的图中,相同的数字指相同的部件,图1从概念上说明为计算机程序100生成数字封条或数字签名的过程。首先,使用一个散列函数110为整个计算机程序100计算一个散列值,从而计算程序散列值120。所述程序散列值120是从所述计算机程序100导出的一个小的代表,诸如校验和。然后,使用数字签名函数130用可信实体的私钥140对所述程序散列值120进行数字签署,生成用于程序散列的数字签名150。用于程序散列的数字签名150就是当程序被分发时与之相伴随的数字封条(或数字签名)。
验证数字加封的计算机程序的真实性图2是流程图,说明在图1中用于程序散列的数字签名150如何被用来验证程序的真实性。参照图2,在步骤210,使用计算机程序100的计算机系统首先装载整个计算机程序100。然后,在步骤220,计算机系统为整个计算机程序100计算一个程序散列值(如同在图1中由散列函数110所做的那样)。
其次,在步骤230和240,所述计算机系统使用生成数字签名的可信实体的公知公钥235,将与计算机程序100相伴随的用于程序散列的数字签名150与来自步骤220的已计算的程序散列值进行比较。具体地说,由数字签名函数用公钥235来处理用于程序散列的数字签名150,然后将其结果与来自步骤220的已计算的程序散列值进行比较。
如果来自步骤220的已计算的散列函数匹配于用公钥235处理之后的用于程序散列的数字签名150,则计算机系统进入步骤250,程序在此开始执行。然而,如果来自步骤220的已计算的散列函数不匹配于用公钥235处理之后的用于程序散列的数字签名150,则计算机系统进入步骤260,并且拒绝执行计算机程序100。
图1和2的验证系统对小型程序来说工作得很满意,然而它不适用于大型的计算机程序。在图2的流程图的步骤210和220中,可以发现图1和2的验证系统存在的一个重大问题。步骤210和220要求把整个计算机程序100装入存储器,然后在整个计算机程序100上计算一个散列值。对大型程序来说,这个过程将占用十分长的时间。因此,用户被迫等待耗时的整个装载和计算过程。今天的不耐烦的计算机用户将简单地不能耐受这样长的装载时间。
需要保护的一个特别大的计算机程序就是用于计算机系统的操作系统。操作系统有权控制所有的计算机输入/输出设备,诸如盘驱动器、网络连接、显示器、备份系统等。因此,人们非常希望能有一个计算机程序验证系统,它能快速地和有效地保护一个计算机操作系统。
增量代码签署本发明引入了一种对计算机程序进行数字签署用于安全的改进方法,它不引入在现有系统中出现的长装载时间。本发明通过把计算机程序分解为一些被单独验证的较小单元来进行工作。
通过增量代码签署数字加封计算机程序图3和图4表示本发明的系统如何为程序生成数字封条,使之能够以更快和更有效的方式被使用。图3表示如何生成数字封条的概念图。图4是详细的流程图,说明用于生成数字封条的方法。
参照图3和图4,在步骤410中,本发明首先将计算机程序300分解为许多“页面”(380至389)。大多数计算机系统已经使用分页存储器组织来实现虚拟存储器系统。因此,本发明可以使用由特定的处理器和/或操作系统提供的现有存储器分页系统。存储页面的大小典型地为4千字节(4k)或8k。
其次,在步骤420和430中,所述系统使用散列函数310,为计算机程序300的每一个存储页面计算一个散列值。散列函数310可以是任何散列函数,诸如公知的SHA或MD5散列函数。如图3所示,散列函数310将为计算机程序300的每一个存储页面(380至389)生成一个相关的散列值(390至399)。在一个实施例中,输出散列值的大小为20字节。然而,可以使用多种不同大小的散列值。
在步骤440中,本发明的系统将计算的散列值(390至399)安排到被称为散列值阵列373的散列值阵列中。然后,在步骤450中,所述系统使用散列函数370为整个散列值阵列373计算一个阵列散列值360。在一个实施例中,散列函数370相同于散列函数310。然而,可以使用不同的散列函数。
然后,在步骤460中,加封程序的可信实体使用签名函数330,通过它的私钥340对阵列散列值360进行数字签署,以便生成用于散列值阵列的数字签名350。最后,在步骤470,散列值阵列373以及用于散列值阵列的数字签名350,连同计算机程序300一起被存储。散列值阵列373以及用于散列值阵列的数字签名350也随同计算机程序300一起被分发,使得计算机程序300的任何接收者都能验证其真实性。
验证数字加封的计算机程序的真实性一旦为一段计算机程序生成一个散列值阵列373以及用于散列值阵列的数字签名350,就可以向用户分发所述计算机程序,使用户可以快速地和有效地验证所述计算机程序。图5是流程图,说明已经通过增量代码签署数字加封的计算机程序的接收者如何验证并执行已经数字加封的计算机程序。
参照图5,在步骤510,接收者的个人计算机系统首先装载伴随所述计算机程序的散列值阵列。在步骤515,计算机系统为整个散列值阵列计算一个散列值。由于散列值的阵列不是很大,所以这种特定的散列计算可以非常迅速地完成。
其次,在步骤520和525,所述计算机系统使用加封所述计算机程序的可信实体的公知公钥,比较计算的散列值和伴随所述计算机程序100的散列值阵列的数字签名。
如果所述数字签名不匹配于从散列值阵列计算的散列值,则计算机系统进入步骤580,在此它拒绝执行所述计算机程序。由于未经授权的实体已经损坏了数字签名和/或散列值阵列,所以执行被拒绝。
回到步骤525,如果所述数字签名匹配于从散列值阵列计算的散列值,则计算机系统进入步骤530,在此它装载计算机程序的一个页面。然后,在步骤540,所述计算机系统为装载的计算机程序页面计算一个散列值。可以在计算机的操作系统的存储器分页机构内进行此种计算。在步骤550和555,比较针对已装载计算机程序页面的已计算散列值与特定存储页面相关的散列值阵列中的散列值。
如果针对已装载计算机程序的已计算散列值不匹配于来自散列值阵列的相关散列值,则计算机系统进入步骤580,在此它拒绝继续执行。此种拒绝继续执行可以被实现为所述计算机系统的虚拟存储器系统内的页面故障。告知此种失败的其它可能的方法可以是指出所述页面不可读、已经出现验证差错,或者简单地中止。
回到步骤555,如果针对已装载的计算机程序页面的已计算散列值匹配于来自散列值阵列的相关散列值,则计算机系统进入步骤560,在此开始执行所述程序的已装载页面。最后,所述程序将完成所述已装载的页面(以及先前已装载的页面)中的代码的执行,并将完全地完成执行,或者需要计算机程序的另一个页面,如步骤570所述那样。如果所述程序已被完全地完成执行,则计算机简单地进入步骤590,在此它已被完成。
在步骤570,如果需要计算机程序的另一个页面,则计算机系统返回到步骤530,以便装载计算机程序的所需页面。新装载的页面必须通过步骤540、550和555被验证。
要注意的是,计算机系统利用先前已验证的散列值阵列来进一步地验证装载的每一个存储页面。因此,计算机必须保证在程序执行过程中,已验证的散列值阵列没有受到损坏。例如,如果操作系统将已验证的散列值阵列交换到受保护的存储器以外,则一旦所述散列值阵列被装回,它必须被重新验证以保证其真实性。
该书面的说明书和附图已经足够详细地公开了本发明,并且带有一定程度的特殊性。本领域的技术人员应当理解,已经作出的各实施例的公开内容仅借助于实例,并且在各部件的安排、组合和步骤方面可以作出各种各样的改变而不离开所主张的本发明的精神实质和范围。因此,本发明的范围由所附的权利要求书来规定,而不是由前面的实施例的说明来规定。
权利要求
1.一种用于加封计算机程序的方法,所述方法包括将所述计算机程序分解为多个块;为每一个所述块计算一个散列值;生成具有所述各块的所述散列值的散列值阵列;数字签署所述散列值阵列以生成数字签名;以及组合所述计算机程序以及所述散列值阵列和所述数字签名。
2.如权利要求1所述方法,其中,计算所述散列值包括计算SHA散列值。
3.如权利要求1所述方法,还包括分发所述计算机程序、所述散列值阵列和所述数字签名。
4.如权利要求2所述方法,其中,数字签署所述散列值阵列以生成数字签名包括为所述散列值阵列计算一个阵列散列值;以及数字签署所述阵列散列值。
5.如权利要求4所述方法,其中,数字签署所述阵列散列值包括通过一个私钥和一个公钥加密密钥函数来生成所述数字签名。
6.如权利要求1所述方法,其中,组合所述计算机程序以及所述散列值阵列和所述数字签名包括将所述计算机程序、所述散列值阵列和所述数字签名存储在一起。
7.如权利要求1所述方法,其中,所述计算机程序包括一个操作系统。
8.一种用于验证计算机程序的方法,所述方法包括通过使用伴随所述计算机程序的散列值阵列的数字签名,来验证伴随所述计算机程序的所述散列值阵列的真实性;装载所述计算机程序的一个块;为所述计算机程序的所述块计算一个计算的散列值;比较针对所述计算机程序的所述块的所述计算的散列值和来自所述散列值阵列的针对所述计算机程序的所述块的相关散列值;以及如果针对所述计算机程序的所述块的计算的散列值不匹配于所述相关散列值,则产生一个错误。
9.如权利要求8所述方法,其中,验证所述散列值阵列的真实性包括为伴随所述程序的散列值阵列计算一个阵列散列值;以及使用公钥来比较所述阵列散列值和所述散列值阵列的所述数字签名。
10.如权利要求8所述方法,其中,通过使用散列值阵列的数字签名来验证伴随所述计算机程序的所述散列值阵列的真实性包括通过公钥和一个公钥加密密钥函数来测试所述数字签名。
11.如权利要求8所述方法,还包括当执行需要所述计算机程序的附加块时,重复装载、计算、比较以及生成的所述步骤。
12.如权利要求8所述方法,其中,计算所述计算的散列值包括计算一个SHA散列值。
13.如权利要求8所述方法,其中,如果针对所述计算机程序的所述块的所述计算的散列值不匹配于所述相关散列值则产生所述错误包括指出块错误。
14.如权利要求8所述方法,其中,如果针对所述计算机程序的所述块的所述计算的散列值不匹配于所述相关散列值则产生所述错误包括指出块读取错误。
15.如权利要求8所述方法,其中,如果针对所述计算机程序的所述块的所述计算的散列值不匹配于所述相关散列值则产生所述错误包括指出验证错误。
16.如权利要求8所述方法,其中,所述计算机程序包括一个操作系统。
17.如权利要求8所述方法,还包括交换出所述散列值阵列;以及在交换回所述散列值阵列之后,重新验证所述散列值阵列的真实性。
18.一种含有一组计算机指令的计算机可读介质,所述计算机指令通过下列各步骤来验证一段计算机程序通过使用伴随所述计算机程序的所述散列值阵列的数字签名,来验证伴随所述计算机程序的散列值阵列的真实性;装载所述计算机程序的一个块;为所述计算机程序的所述块计算一个计算的散列值;比较针对所述计算机程序的所述块的所述计算的散列值和来自所述散列值阵列的针对所述计算机程序的所述块的相关散列值;以及如果针对所述计算机程序的所述块的所述计算的散列值不匹配于所述相关散列值,则产生一个错误。
19.如权利要求18所述的计算机可读介质,其中,验证所述散列值阵列的真实性包括为伴随所述程序的散列值阵列计算一个阵列散列值;以及使用公钥来比较所述阵列散列值和所述散列值阵列的所述数字签名。
20.如权利要求18所述的计算机可读介质,其中,通过使用所述散列值阵列的数字签名来验证伴随所述计算机程序的散列值阵列的真实性包括通过一个私钥和一个公钥加密密钥函数来测试所述数字签名。
全文摘要
本发明公开了一种用于快速和容易地验证大型计算机程序的方法。本系统是这样运行的首先以增量方式用数字签名来加封计算机程序。具体地说,所述计算机程序被分解为一组页面,并且为每一个页面计算一个散列值。所述散列值的集合被形成为一个散列值阵列,然后用数字签名来加封所述散列值阵列。接着,所述计算机程序连同所述散列值阵列和所述数字签名一起分发。为了验证所述计算机程序,接收者首先通过数字签名和公钥来验证散列值阵列的真实性。一旦所述散列值阵列已经被验证,接收者随后可通过计算待装载的一个页面的散列值,然后与已验证的散列值阵列中的一个相关散列值进行比较,来验证所述计算机程序的每个页面的真实性。如果散列值不匹配,则停止执行。
文档编号H04L9/32GK1842757SQ200480021611
公开日2006年10月4日 申请日期2004年9月10日 优先权日2003年9月18日
发明者佩里·基特赖伯, 迈克尔·布劳沃 申请人:苹果电脑有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1