程序集安全注意事项

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

使用证据有两种不同的方法:

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

  • 输入证据保持不变,用作策略决策中的最终证据集。 使用此语义的方法包括 Assembly.Load(byte[])AppDomain.DefineDynamicAssembly()。

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

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

  • 请勿使用权限请求来获取代码可能需要的权限,但如果未授予权限,请准备好处理安全异常。

    注释

    安全性是一个复杂的区域,你可以从中进行选择。 有关详细信息,请参阅 关键安全概念

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

强名称程序集和签名工具

警告

不要依赖于通过强名称实现安全性。 它们仅提供唯一标识。

可以通过两种不同的但互补的方式对程序集进行签名:使用强名称或使用 SignTool.exe(签名工具)。 使用强名称对程序集进行签名会将公钥加密添加到包含程序集清单的文件。 强名称签名有助于验证名称唯一性,防止名称欺骗,并在解析引用时向调用方提供一些标识。

任何信任级别都不会与一个强名称关联,这就使 SignTool.exe(签名工具)变得十分重要。 这两种签名工具要求发布者向第三方机构证明其身份并获取证书。 然后,此证书嵌入到文件中,可由管理员用来决定是否信任代码的真实性。

你可以为程序集提供强名称和使用 SignTool.exe(签名工具) 创建的数字签名,也可以单独使用。 这两个签名工具一次只能对一个文件进行签名:对于多文件程序集,请对包含程序集清单的文件进行签名。 强名称存储在包含程序集清单的文件中,但使用 SignTool.exe(签名工具) 创建的签名存储在包含程序集清单的可移植可执行文件(PE)文件中的保留槽中。 如果您已有依赖于由 SignTool.exe(签名工具) 生成的签名的信任层次结构,或者您的策略仅使用密钥部分且不检查信任链,则可以使用 SignTool.exe(签名工具) 对程序集进行签名(无论是否具有强名称)。

注释

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

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

使用SignTool.exe(签名工具)进行强命名和签名,以通过数字签名和证书确保完整性。 提到的所有技术(即哈希验证、强命名和使用 SignTool.exe(签名工具)进行签名,共同确保程序集未以任何方式更改。

另请参阅