实现本发明的模式
现在参考附图描述本发明,其中相同标号在全文中用于指示相同的元件。本发明的描述涉及在运行时间期间有利于由应用程序使用的组件完整性的系统和方法。这些组件典型的是动态链接库(DLL),但也可包括在运行时间链接到应用程序的定义文件、宣称文件和可执行文件。按照主题发明的至少一个方面的组装件这里定义为包括了描述该组装件的元数据的组件或包括了描述一个组装件所依赖的该组装件的元数据的组件。本发明使用密码术技术,例如散列和数字签名来创建随应用程序使用的安全组装件。本发明使用数字加密和签名技术。本发明使用公开密钥密码术技术,如Schneier,Bruce著,“Applied Cryptography Second Edition:Protocols,Algorithms,and SourceCode in C;New York:John Wiley & Sons,1996,通过引用结合于此。本发明使用RSA(Rivest,Shamir and Adlemen)公开密钥算法用于数字签名,并结合了称之为SHA(安全散列算法)的散列算法,然而也可使用其它公开密钥签名方案。公开密钥密码术的基本概述是这样的,给予每个开发商一对包括私人密钥和公开密钥的密钥对。密钥可以是一种接收文件的各比特并从文件中的各比特产生数值序列的算法。私人密钥是分配给开发商的唯一密钥并希望由开发商加以保密。公开密钥通常可供开发商和用户使用。公开密钥可用于验证接收数据文件上的数字签名是真实的(例如,数字签名是用私人密钥建立的)。文件可用私人密钥加密而公开密钥用于对密文解码。本发明提供关于组装件的顶层组装件文件的RSA加密的SHA散列值以及存储在顶层组装件的元数据中的用于验证组装件完整性的公开密钥。
本发明还使用标准公开密钥加密术解决在运行时间名字的唯一性和名字安全性问题。用密钥对加密的名字称之为共享名。特别是,籍助于唯一的密钥对并防止他人“接管名字空间”,共享名保证了名字的唯一性,因为只有组装件的开发商具有该组装件的私人密钥,使得无人对其它组装件生成相同的名字。
图1示出了组装件和按照本发明使用带有数字签名加密法的关系。第一组装件10包括一顶层组装件12和一模块14。元数据部分16提供在顶层组装件12内,包括了与第一组装件10有关的信息。元数据部分16包括标识信息组件17和文件验证摘要组件18。标识信息17包括有关第一组装件10的信息,同时文件验证摘要组件18包括有关模块14的信息。标识信息组件17可包括发行信息、公开密钥、版本信息、操作系统信息以及关于第一组件10的许多其它类型信息。公开密钥形成了可以在运行时间验证的组装件名字的一部分。文件验证摘要组件18可包括模块14的散列值。标识信息组件17和文件验证摘要组件18中的信息可用于在运行时间前或运行时间时验证该组装件未被修改。组装件摘要19提供在顶层组装件12的末尾。顶层组装件摘要19可包含该顶层组装件12内容的散列值。随后用与位于标识信息组件17中的公开密钥匹配的私人密钥对顶层组装件加密。加密的散列值可用于验证顶层组装件12的内容尚未被修改,同时文件验证摘要组件18中的散列值可用于验证模块14尚未被修改。
可以理解大部分应用程度是由若干组装件构成。其中一些在运行时引用其它组装件。因而,图1还示出了提供的第二组装件20要依赖于或引用第一组装件10。元数据部分22提供在第二组装件20中,它包含了关于第二组件20的信息,以及还有在运行时间第二组装件要引用的有关第一组装件10的信息。元数据部分22包括标识信息组件24和公开密钥标记摘要组件26。标识信息组件24包括有关第二组装件20的信息,同时引用验证摘要组件26包括有关第一组装件10的信息。标识信息组件24可包括发行信息、公开密钥、版本信息、操作系统信息以及有关第二组装件20的许多其它类型信息。
公开密钥标记摘要组件26包括第一组装件10的公开密钥的缩减散列值。典型地,使用安全散列算法(sha-1)的散列值是160比特的字。本发明使用该散列值的前64比特或8字节来验证第一组装件10的公开密钥与存储在第二组装件20中的公开密钥相匹配。公开密钥标记摘要组件26中的信息在运行时间前或在运行时间时用于验证第二组装件20是来自所期望的(例该私人密钥拥有者)的出版商。因而,如果信息组件17中的公开密钥的前64比特与公开密钥标记摘要26中的公开密钥标记匹配,就有某种程度的确定性认为第一组装件10的确来自匹配该公开密钥的私人密钥的拥有者。
图2更详细示出了按照本发明的一个组装件的组件。组装件30由顶层组装件40、第一模块45和第二模块50组成。顶层组装件40包括被称为组装件表征的元数据部分42。组装件表征42包括标识信息,诸如下列项:公开密钥、主版本、次版本、修订版、构成和模块信息。其它信息也可放在标识信息中(例如,操作系统,地点)。模块信息是构成该组装件30的模块以及每个模块文件内容散列值的列表。在运行时间前或运行时间时,可使用相同的散列算法把文件散列值和模块散列值与第一模块45和第二模块50的实际散列值相校验,以确定组装件30的完整性。顶层组装件40包括位于文件末尾的顶层组装件散列值43。顶层组装件散列值用与标识信息中公开密钥相匹配的开发商私人密钥加密。标识信息中的公开密钥可用于将顶层组装件散列值43解码成可与文件其余内容的实际散列值相比较的散列值。然后可以确定顶层组装件40是否出现由未授权来源所作的任何改变。如果组装件30已改变,调用组装件30的应用程序可选择自动中止。
图3更详细示出了按照本发明的引用另一组装件的一个组装件的构成。引用组装件70(标为组装件B)引用第一被引用组装件80(标为组装件C)及第二被引用组装件90(标为组装件D)。引用组装件70包括组装件表征72,具有的标识信息类似于图2所述的顶层组装件标识信息。组装件表征72还包括了从属信息,该信息包括了引用组装件70在执行期间所依赖的各组装件的列表。该组件列表还包括了用于每一组装件的公开密钥标记,它是在被引用组装件表征中公开密钥的缩减散列值。第一被引用组装件80具有组装件表征82,包括标识和从属信息以及组装件摘要83。从属信息的存在通知应用程序第一被引用组装件80还依赖于至少一个其它组装件(未示出)。第一被引用组装件80不具有任何模块并且因而标识信息不包括用于任何模块的散列值。
第二被引用组装件90具有组装件表征94,它包括了标识信息,但不具有任何从属信息。因而,第二被引用组装件90不依赖于任何其它组装件而执行。第二被引用组装件90由顶层组装件92、第一模块90及第二模块98组成。标识信息包括组装件90的模块以及每一模块整个内容的散列值的列表。组装件摘要95提供在顶层组装件92的末尾。组装件摘要包括顶层组装件92的其余文件内容的散列值。该散列值用组装件作者的私人密钥加密。组装件表征94中的私人密钥和公开密钥形成了一对具有唯一数学关系的密钥对。组装件70、80和90的整个内容可在运行时间被加载到计算机系统的一个高速缓存中,而引用组装件中的公开密钥标记可用于验证被引用组装件中的公开密钥。组装件摘要中的加密标记可使用组装件表征中的公开密钥来解码并随后与顶层组装件中运作的散列值比较以验证该组装件尚未被窜改过。
图4和以下的讨论旨在提供对可实现本发明的适当的计算机环境的简要的一般描述。虽然将在可在个人计算机或服务器计算机上运行的计算机程序的计算机可执行指令的一般内容中描述本发明,但本领域的技术人员将认识到本发明也可与其它程序模块组合而实现。通常,程序模块包括例程、程序、组件、数据结构等等,它们执行特定的任务或实现特定的抽象数据类型。而且,本领域的技术人员还将认识到本发明也可用其它的计算机系统配置来实现,包括单处理器或多处理器计算机系统、微型计算机、大型计算机、手持计算装置、基于微处理器或可编程消费电子设备及类似产品。本发明所展示的实施例还可在分布式计算环境中实现,其中任务是由通过通信网络链接的远程处理设备来实现的。可是,本发明的某些实施例可由独立的计算来实现。在分布式计算环境中,程序模块可位于本地和远程存储器两者的存储装置中。
参考图4,用于实现本发明的一个示例系统包括一台常规的个人计算机或服务器计算机120,它包括处理单元121、系统存储器122和系统总线123,系统总线123把包括系统存储器在内的各种系统组件耦合到处理单元121。处理单元可以是任何各种商用处理器,包括来自Intel和其它公司(包括Cyrix、AMD和Nexgen)的Intel X86、奔腾和兼容微处理器;来自Digital的Alpha;来自MIPS Technology、NEC、IDT、Siemens及其它公司的MIPS;以及来自IBM和Motorola的PowerPC。双微处理器和其它多处理器结构也可用作处理单元121。
系统总线可以是若干种总线结构中的任何一种,包括存储器总线或存储器控制器、外设总线以及使用各种常规总线结构,诸如PCI、VESA、Microchannel、ISA和EISA(只列出几个)中任何一种的局部总线。系统存储器包括只读存储器(ROM)124以及随机存取存储器(RAM)125。ROM 124中存储了基本输入/输出系统(BIOS),它包含了例如在启动期间帮助在计算机120内各元件间转移信息的基本例行程序。
计算机120进一步还包括了硬盘驱动器127、例如对可移动盘129读写的磁盘驱动器128、以及例如用于从CD-ROM盘131读取或对其它光媒体读写的光盘驱动器130。硬盘驱动器127、磁盘驱动器128以及光盘驱动器130分别通过硬盘驱动器接口132、磁盘驱动器接口133和光盘驱动器接口134与系统总线123相连。驱动器和它们相关的计算机可读媒体为服务器计算机120提供了对数据、数据结构、计算机可执行指令等的非易失性存储。虽然上述计算机可读媒体指的是硬盘、可移动磁盘及CD,本领域的技术人员应当理解计算机可读的其它种类媒体,诸如磁带盒、快闪存储卡、数字视频盘、Bernoulli盒式存储器及类似存储器也可用于示例的操作环境中。
一些程序模块也可存储在驱动器和RAM 125中,包括操作系统135、一个或多个应用程序136、其它程序模块137及程序数据138。所示计算机中的操作系统可以是Microsoft Windows NT服务器操作系统,加上前面提到的Microsoft事务服务器、Microsoft Windows 95,Microsoft Windows 98或Microsoft Windows 2000。
用户可以通过键盘140或指点设备如鼠标142将命令和信息输入计算机120。其它输入设备(未示出)还可包括话筒、操纵杆、游戏板、卫星转盘、扫描器及类似装置。这些或其它输入设备常通过耦合到系统总线的串行端口接口146连接到处理单元121,但也可以通过其它接口,例如平行端口、游戏端口或通用串行总线(USB)来连接。监视器147或其它类型显示设备也通过接口,例如视频适配器148连接到系统总线123。除了监视器外,计算机通常还包括其它外输出装置(未示出),例如扬声器和打印机。
计算机120也可工作在联网环境中,使用逻辑连接与一个或多个远程计算机,例如远程服务器或客户机计算机149相连。远程计算机149可以是工作站、服务器计算机、路由器、对等装置或其它公共网络节点,并且典型地包括了许多或所有的上述与计算机120相关的元件,虽然图4中仅展示了存储器存储装置150。图4所示的逻辑连接包括局域网(LAN)151及广域网(WAN)152。这样的组网环境在办公室、企业内计算机网络、内联网及因特网中是常见的。
当用于LAN网络环境中时,计算机120通过网络接口或适配器153连接到局域网151。当用于WAN网络环境中时,服务器计算机120典型地包括了调制解调器154、或连接到LAN上的通信服务器,或具有用于在广域网152,例因特网上建立通信的其它装置。调制解调器154可以是内置式或外置式的,通过串行端口接口146连接到系统总线123。在联网环境中,所述的与计算机320或它的几个部分有关的程序模块可以存储在远程存储器存储装置中。将会理解所示的网络连接是示例性的,且还可以使用在计算机之间建立通信链路的其它装置。
根据本领域熟练的计算机编程人员的实践,本发明下面的描述将参照由计算机120执行的动作和操作的符号表示而进行,除非另外指出。这类动作和操作有时被称为是被计算机执行的。将理解这些动作和符号表示的操作包括由处理单元121对代表数据比特的电信号的操作,产生电信号表示的最终变换或压缩,以及对计算机存储系统(包括系统存储器122、硬驱动器127、软盘129及CD-ROM 131)中存储器位置处的数据比特的维护并由此重新配置或以不同的方式改变计算机系统的操作,以及其它的信号处理。数据比特被维护的存储器位置是具有与数据比特对应的特定电、磁或光特性的物理位置。
图5更详细说明了关于本发明的环境。处理器200通过总线225耦合到存储媒体220。处理器还通过网线215耦合到网路210。网络210能使处理器用其它远程计算机检索和发送组装件及其它组件。存储器媒体220包括独立于存储器其余部分的高速缓冲存储器230。高速缓冲存储器230是应用程序232执行的地方。应理解到其余的存储器可以是二级高速缓存、ROM、RAM或一些固定或软盘媒体。散列组件260驻留在存储器媒体220上用于在组装件开发阶段插入组装件的散列值。然而散列组件260可以在应用程序和组装件初始使用和测试期间或由管理员在随后时间插入散列值。
数字签名组件265提供用于建立组装件的密钥对。数字签名组件265还将公开密钥插入被开发的组装件的表征中。数字签名组件265使用散列组件260求出组装件内容的散列值并随后用私人密钥对该散列值加密,私人密钥与存储在组装件表征中的公开密钥一起组成密钥对。散列组件260和数字签名组件265可以是作为操作系统275一部分驻留的应用程序接口(API)。然而,散列组件260和数字签名组件265可以是应用程序232的一部分。更进一步,散列组件260和数字签名组件265可以由一些不同的组件组成,例如独立的用于散列、版本、密钥对创建和插入功能的组件。
应用程序232被部署并加载到高速缓存230中。应用程序232与加载器250通信,加载器250定位由应用程序232指定的并由应用程序232在运行时间使用的组装件,同时将这些组装件加载到高速缓存230中。在本例中,第一组装件234(标为组装件A)及第二组装件236(标为组装件B)被加载到高速缓存230中。第二组装件236包括第一模块238和第二模块240,它们也被加载到高速缓存230中。第一组装件234和第二组装件236可以作为操作系统275的一部分的共享组装件驻留、可以作为库文件驻留在远程计算机上、可以作为应用程序232的一部分驻留在目录中或驻留在其它应用程序内。
绑定组件280也驻留在存储器媒体220中。绑定组件280提供绑定的策略并用于对处理共享组装件的应用程序进行管理。绑定组件280可决定是否绑定到组装件的原始版、升级版或标准版。例如,第一组装件234和第二组装件236可具有相同的组装件名,其中第二组装件236是第一组装件234的升级版。而且两种组装件都可由加载器250加载到高速缓存230中。绑定组件280随后可确定根据绑定组件280中定义的绑定策略是将应用程序232绑定到第一组装件234还是绑定到第二组装件236。绑定组件280可以允许具有相同名字的组装件并列驻留在系统中并且给予应用程序232、开发商或管理员控制作出关于要遵循何种合适绑定策略的决策能力。
验证组件270驻留在存储器媒体220中。调用验证组件以读取组装件中的表征、将密钥值与密钥标记比较、使用公开密钥解码加密的散列值以及调用可用于组装件散列值的散列算法。验证组件270然后将组装件上已解码的加密散列值与组装件上运行的实际散列值比较。验证组件270随后通知应用程序232组装件的作者是否是私人密钥拥有者或者组装件是否发生了任何变化。验证组件270接着决定是否要根据由绑定组件280设定的绑定策略校验版本和出版商信息。在本发明的另一种方面,验证组件保留了一张应用程序在初始部署和测试期间使用的组装件的数字签名和散列值的表。验证组件随后可运行组装件上的散列值并将该散列值与表中找到的散列值比较。验证组件270可以是作为操作系统一部分驻留的应用程序接口(API)或者可以是应用程序232的一部分。
应理解上述组件的例子描述为是独立的仅出于说明的目的。应懂得各种组件可以集成在其它组件中而仍保持上述的功能性。而且以上描述只是组件如何互动以实现本发明的一个例子,其它的例子也可以用于实现本发明。
图6示出了用于确保和验证具有模块的组装件的完整性的方法。在步骤300,提供的组装件至少具有一个模块。在步骤310,为组装件的顶层组装件提供了包括公开密钥的标识信息并且该公开密钥还被存储在存储媒体中。在步骤320中,提供顶层组装件的整个文件内容的散列值,然后用与公共密钥一起构成密钥对的私人密钥对该散列值加密并且将加密后的值附加到组装件的末尾。应用程序232和由应用程序使用的组装件现在可以加载到高速缓存230中用于执行。在步骤330,从顶层组装件的标识信息中读取公开密钥并用于解码加密的散列值,这样解码所得的散列值就可与顶层组装件中的实际散列值比较。在步骤340,确定组装件的内容是否已改变。如果该组装件已改变(YES),应用程序在步骤345处中止。如果组装件未改变(NO),在步骤350将表征中的公开密钥与存储媒体中存储的公开密钥比较。公开密钥的比较也可以在解决一个组装件对另一个组装件的引用时进行。在步骤360,验证组件275确定公开密钥是否匹配。如果出版商不是同一出版商或原始出版商(N0),应用程序在步骤365处中止。如果出版商是同一出版或或原始出版商(YES),在步骤370求出模块的散列值并用存储在标识信息中的散列值对该值校验,执行该组装件。
图7示出了用于确保和验证由其它组装件引用的组装件的完整性的特定方法。在步骤400,提供的组装至少引用一个其它组装件。在步骤410,向被引用的组装件提供包括公开密钥的标识信息。在步骤420,提供被引用组装件的散列值并用与公开密钥匹配的私人密钥加密该散列值,并将加密后的散列值附加在被引用组装件的末尾。在步骤430,向组装件提供从属信息,从属信息包括了所有被引用组装件及与每个被引用组装件对应的公开密钥的公开密钥标记的列表。现在可由加载器250将应用程序232和应用程序使用的组装件加载到高速缓存230中用于执行。在步骤440,读入被引用组装件的公开密钥并用公开密钥对加密的散列值解码,并且将解码后的加密散列值与被引用组装件上运行的实际散列值比较。在步骤450,确定任何被引用组装件的内容是否已改变。如果至少一个被引用组装件已改变(YES),应用程序在步骤455中止。如果没有任何被引用的组装件有改变(NO),在步骤460,将引用组装件中的公开密钥标记与被引用组装件中的公开密钥比较。在步骤470,验证组件275确定被引用组装件的出版商是否同一出版商或原始出版商。如果出版商不是原始出版商(NO),应用程序在步骤475中止。如果出版商是原始出版商(YES),在步骤480验证每个被引用组装件的模块并执行组装件。
图8-10描述了适用于提供必要的加密术功能以利于跨工具实现共享名的简单API以及运行时间。当前的例子移去了许多与使用密码术服务提供器(CSP)、密钥管理和数字签名/验证操作相关的复杂性。当前的API例子还代表了一组可以移植到各种不同平台的API。
共享名生成要求在开发平台上对公开/私人密钥对生成、散列、数字签名及签名验证的支持。运行时间平台仅要求散列和签名验证。API分成允许适合于对开发系统的支持和对运行时间系统的支持。当前API的例子假设对所有加密操作(例“Microsoft Base Cryptographic Provider Vl.0”)实现预指定CSP、RSA签名算法和SHA-1散列算法。CryptoAPI函数可以被提供为非管理的C代码接口,如果成功该函数返回TRUE,如果出错则返回FALSE。
当前的API例子可以支持由编译器销售商来生成和管理密钥。当前API的例子被设计成为普通开发情景提供所需的灵活性然而仍是容易使用的。使用这些API,编译器有可能生成共享名加密密钥对,并检索可被容易地跨开发平台存储和移动的一种表示(可移值密钥二进制大型对象)。还可能使共享名密钥加密对与项目关联,并将它用于共享名生成。密钥对不必永久地安装在用于共享名生成的加密服务提供器(CSP)中,这样就可容易地适应让每个项目使用不同的密钥对。此外,例子API提供了确信:共享名密钥操作将不会因用户机器上的其它操作而影响加密功能的使用。
图8a示出的函数用于为共享名使用创建新密钥对并将该密钥对输出给调用程序。容器名是用户定义的串。该函数允许用户定义名字使得可以管理多重共享名密钥对(例如,project 1对project 2,test对deploy)。参数dw Flags被用于控制任选项动作。对这一版本仅有的定义标志是SN_LEAVE_KEY(值为1)。如果设定,则安装的密钥对将留在共享名CSP中。图8a中的函数会尝试用所提供的前缀为“SNK”的容器名来创建一新的签名密钥对。前缀SNK对于调用应用程序将是不可见的并被用于提供一种好的确信,即所提供的容器名将不会与不同应用程序所用的容器名发生冲突。可以使用另外的前缀而不脱本发明的范围。生成的密钥将被标记成可供输出(如果受CSP支持),而且公开/私人密钥在未加密的密钥二进制大型对象(keyblob)中被输出。这密钥被返回给调用程序。该keyblob可以用对调用应用程序方便的任何方式来存储。如果被修改,它将不再能使用。
图8b示出的函数可用于将可移值的密钥二进制大型对象(keyblob)安装在机器CSP中。其目的是要支持缺省共享名密钥的安装。这一函数试图用所提供的容器名将密钥二进制大型对象中提供的密钥对安装到共享名CSP中。正如上面说明的,容器名可透明地加入前缀“SNK”以最小化与其它应用程序密钥发生冲突的可能性。如果容器名已存在或提供了一不合法的密钥二进制大型对象,返回一错误。
图8c示出的函数可用于从CSP中删除共享名密钥对。如果在密钥生成时SN_LEAVE_KEY选项被选中,或该密钥随后被安装到CSP中,这函数将是仅有的需要。这函数将获取带有标志CRYPT_DELETEKEYSET的给定密钥容器名的共享名CSP环境。所供给的容器名可在这一操作前冠以前缀“SNK”以避免与其它应用程序发生潜在的名字冲突。图8d示出的函数用于释放由图8a中所示的共享名函数所分配的存储器。
在安全地定义一共享名名字空间中,包含组装件元数据的可移植可执行(PE)文件用与定义名字空间的公共密钥对应的私人密钥来签名。开发环境可执行在生成一共享名中所需的操作。首先,检索出共享名公开密钥二进制大型对象。在元数据部分保留出空间以存放该密钥二进制大型对象并将它插入。可任选地,共享名公开密钥二进制大型对象可被项目系统存储,使得在其它组装件中创建引用时可利用该二进制大型对象。其次,检索出共享名签名二进制大型对象的大小。在PE文件中分配空间以容纳该签名。随后可将PE文件保存到盘片上。然后生成共享名签名二进制大型对象。该调用程序将提供PE文件和共享名密钥以供使用。签名函数将计算签名,并可任选地将它插入到PE文件中被定义的部分。图9a-9c示出了支持上述操作的各种API。在每个函数中,共享名密钥对可作为可移值密钥二进制大型对象,或作为对早已安装在共享名CSP中的密钥对的容器名引用而被提供。共享名CSP、散列算法和签名算法可基于默认的机器设置。
图9a示出了支持对公开密钥二进制大型对象检索的方法。该函数将试图获取带有所提供的szContainer名的共享名CSP环境。正如对于前面所述的API那样,容器名将被悄然冠上前缀“SNK”。如果pbKeyBlob为NULL(空),则认为密钥对已安装在CSP中,所以容器必定存在且它必定包含了与签名算法相关联的公共密钥对。如果pbKeyBlob为non-Null(非空),则用CRYPT_NEWKEYSET获取CSP。在这种情况下,如果存在容器名则返回一出错信息。如果成功地获取了CSP,则可输入密钥二进制大型对象中的密钥对。在这种情况下,将在函数返回前删除密钥对。图9b示出了经编码的返回的PublicKeyBlob。
图9c示出了支持签名操作的API。它可被用于检索签名二进制大型对象的大小,这样就可以分配PE文件中的空间。然后可把它用于生成签名。该函数可任意地将签名直接写入PE文件或将签名二进制大型对象返回给调用程序。这一函数将试图获取带有所提供的szContainer名的共享名CSP环境。正如前面所讨论的,容器名可以被悄然冠上前缀“SNK”。如果pbKeyBlob为NULL,则认为密钥对已安装在CSP中,故容器已存在且它包含了与签名算法相关联的公开密钥对。如果pbKeyBlob为non-NULL,则用CRYPT_NEWKEYSET获取CSP。在这种情况下,容器名应该不存在。如果成功获取CSP,则输入密钥二进制大型对象中的密钥对。在这种情况下,将在函数返回前删除密钥对。如果szFilePath为NULL,它指示出只返回签名二进制大型对象的大小。这大小被返回到由*pcbSignatureBlob指向的位置内。如果szFilePath为non-NULL,则对PE文件求散列值并且用私人密钥对该散列值签名。如果ppbSignatureBlob为NULL,这个函数将把签名二进制大型对象插入PE的保留部分中并执行任何所需的PE修整(例CRC)。如果调用程序希望处置签名二进制大型对象和它在PE文件中的插入,则ppbSignatureBlob应当是一个有效的指向一指针变量的指针。
图10a-10c示出了创建-固定大小的“标记”以引用共享名名字空间和进行签名验证。这可用来自与名字空间相关的公开密钥的散列值来计算。这一散列操作用于缩减与密钥大小相关的标记的大小,提供具有高度确信的唯一标记(统计上唯一)使得伪造共享名极其困难。SHA-1散列函数具有所希望的特性且可供使用,因为我们在生成共享名中已采用了它的用法。SHA-1的一个缺点是它生成一个160比特的值。这远小于典型的RSA签名密钥(512比特或更大),但是大于某些其它算法例如ECC之类通常使用的密钥大小。为了缩减标记的大小,低数量级64比特的SHA-1散列值将被用作标记值。图10a示出了一个用于创建标记的函数,其中公共密钥二进制大型对象是从PE文件中被引用的组装件表征(元数据中的PublicKeyBlob)中提取的。图10b示出了希望从公开密钥二进制大型对象结构生成该标记的一个函数。
图10c示出的一个验证函数,它使用共享名公开密钥来验证共享名签名二进制大型对象。这一操作要求对包含组装件表征的PE文件的引用。如果这一函数返回TRUE,则签名被验证,否则它返回FALSE且应不予考虑该共享名。szFilePath应当是对PE文件的合法引用,且它应该包含元数据中的一个PublicKeyBlob结构和PE文件中为此目的保留的部分中的一个共享名签名blob。该函数使用在SharedNameSignatureGeneration()中所用的相同算法来计算PE文件的散列值。
验证涉及对散列值、签名和公开密钥的操作,这些都依赖于所用的算法。工具(tools)使用加密帮助软件API和组装件元数据API将共享名指定给组装件。对具有共享名的组装件的引用(AssemblyRefs)包含了一个“标记”,该“标记”代表了用于生成被引用组装件中的共享名所用的公开密钥。这一标记在绑定时有助于定位所需的组装件。
当组装件被放置在本地组装件高速缓存中时可由运行时间来验证共享名签名。由于验证是在高速缓存加载时完成,绑定到具有共享名的组装件仅要求密钥等效性校验。作为被引用的一部分所记录的共享名标记可以被包括在高速缓存查找表中。另一种方式,如果对于该特定密钥已有定义在共享名上的规定代码访问安全政策则可在加载时验证签名。
本发明已就编程方法和/或计算机结构和以特定的例子作了说明,然而应当理解可以使用适合于实现本发明的各种编程方法和/或计算机结构且都应包括本所附权利要求的范围内。
本发明已参照了本发明的较佳方面作了描述。很明显一旦阅读和理解了前面的详细描述可以作出其它的修改和变动。本发明应当解释为包括所有此类修改,变动及其等价品。