程序集安全注意事项

在您生成程序集时,您可以指定该程序集运行所需的一组权限。 是否将特定的权限授予程序集是基于证据的。

使用证据有两种截然不同的方式:

  • 将输入证据与加载程序所收集的证据合并,以创建用于策略决策的最终证据集。 使用这种语义的方法包括 Assembly.LoadAssembly.LoadFromActivator.CreateInstance

  • 原封不动地使用输入证据作为用于策略决策的最终证据集。 使用这种语义的方法包括 Assembly.Load(byte[])AppDomain.DefineDynamicAssembly()

通过在将运行程序集的计算机上设置安全策略,您可以授予一些可选的权限。 如果您希望代码可以处理所有潜在的安全异常,可以执行以下操作之一:

  • 为您的代码必须具有的所有权限插入权限请求,并预先处理在未授予权限时发生的加载时错误。

  • 不要使用权限请求来获取您的代码可能需要的权限,但一定要准备处理在未授予权限时发生的安全异常。

    注意注意

    安全性是一个较为复杂的领域,您将要作出很多选择。有关更多信息,请参见安全性的基础概念

在加载时,程序集的证据用作安全策略的输入。 安全策略是由企业和计算机的管理员以及用户策略设置建立的,它在执行时确定向所有托管代码授予的权限组。 可以为该程序集(如果该程序集具有签名工具生成的签名)的发行者建立安全策略,或者为该程序集的下载网站和区域(就 Internet Explorer 而言)建立安全策略,也可以为该程序集的强名称建立该策略。 例如,一台计算机的管理员可以建立这样一种安全策略:它允许从某一网站下载由指定软件公司签发用以访问计算机上的数据库的所有代码,但不授予对该计算机磁盘的写访问权。

强名称程序集和签名工具

可以用两种不同但相互补充的方式对程序集进行签名:使用强名称或使用 .NET Framework 1.0 和 1.1 版中的 Signcode.exe(文件签名工具) 或 .NET Framework 更高版本中的 SignTool.exe(签名工具)。 使用强名称对程序集进行签名将向包含程序集清单的文件添加公钥加密。 强名称签名帮助验证名称的唯一性,避免名称欺骗,并在解析引用时向调用方提供某标识。

但是,任何信任级别都不会与一个强名称关联,这样 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 就变得十分重要。 这两个签名工具要求发行者向第三方证书颁发机构证实其标识并获取证书。 然后此证书将嵌入到您的文件中,并且管理员能够使用该证书来决定是否相信这些代码的真实性。

您可以将强名称和使用 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 创建的数字签名一起提供给程序集,或者您可以单独使用其中之一。 这两个签名工具一次只能对一个文件进行签名,对于多文件程序集,您可以对包含程序集清单的文件进行签名。 强名称存储在包含程序集清单的文件中,但使用 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 创建的签名存储在该程序集清单所在的可迁移可执行 (PE) 文件中保留的槽中。 当您已经具有依赖于 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 生成的签名的信任层次结构或者当您的策略只使用密钥部分并且不检查信任链时,就可以使用通过 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 对程序集进行的签名(带或不带强名称)。

注意注意

在一个程序集上同时使用强名称和签名工具签名时,必须首先分配强名称。

公共语言运行时还将执行哈希验证;程序集清单包含构成该程序集的所有文件的列表,包括当生成清单时存在的每一文件的散列。 在加载每一文件时,其内容已进行哈希处理并与清单中存储的哈希值进行比较。如果两个哈希值不匹配,则无法加载该程序集。

因为强名称和使用 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 进行签名确保了完整性,因此您可以将代码访问安全策略建立在这两种形式的程序集证据的基础上。 强名称和使用 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 进行签名通过数字签名和证书来确保完整性。 上面提到的所有技术(哈希验证、强名称和使用 Signcode.exe(文件签名工具)SignTool.exe(签名工具) 进行签名)共同作用,可以确保程序集没有做过任何方式的改动。

请参见

参考

SignTool.exe(签名工具)

Signcode.exe(文件签名工具)

概念

具有强名称的程序集

公共语言运行时中的程序集