如何生成密钥文件Snk

如何生成密钥文件Snk,第1张

创建密钥

要使用强名称为程序集签名,必须具有公钥/私乱首槐钥对。这一对加密公钥和加密私钥用于在编译过程中创建强名称程序集。您可以使用强名称工具 (Sn.exe) 来创建密钥对。芹运密钥对文件通常哗友具有 .snk 扩展名。

1. Bin文件夹

Bin文件夹包含应用程序所需的,用于控件、组件或者需要引用的任何其他代码的可部署程序集。该滑没余目录中存在的任何.dll文件将自动地链接到应用程序。如果在该文件夹中留有不用的或过期的文件,则可能出现“二义性引用(ambiguous reference)”异常的风险。换句话说,如果两个不同的程序集定义相同的类(相同的命名空间和名称),则ASP.NET运行库不能决定应该使用哪一个程序集,从而抛出一个异常。在开发时,当我们重新命名一个项目或一个程序集的名称时,这是常见的错误。为了避免这种错误,一定不要在该文件夹中保留任何不必要的程序集,或者至少要从配置文件的<assemblies>节中删除如下代码行:

<add assembly="*" />

 

2. App_Browser文件夹

该可选的文件夹包含.browser文件。.browser文件描述浏览器(不管是移动设备浏览器,还是台式机浏览器)的特 征和功能。ASP.NET在安装路径下的Config/Browser文件夹中安装了大量.browser文件,这些文件供所有应用程序共享。我们只是把 当前应用程序特有的浏览器文件放在App_Browser文件夹下。.browser文件的内容即时动态地进行编译,以便向ASP.NET运行库提供最新 的浏览器信息。

让我们简单谈谈拥有一个自定义的.browser文件可能有帮助的场景。设想应用程序使用了一个在某个浏览器下不能有效呈现的控件。在指定的浏览器中显示宿主页面时,可以编写一个.browser文件,迫使ASP.NET使用一个不同的适配器来生成该控件。

<browsers>

<browser id="browserID">

<controlAdapters>

<adapter controlType="Samples.CustomControl"

adapterType="Samples.Adapters.CustomControlAdapter" />

</controlAdapters>

</browser>

</browsers>

假设browserID与ASP.NET识别的标准浏览器之一相匹配,则上文所示的.browser文件指示在指定的浏览器下使用CustomControlAdapter呈现CustomControl。

3. App_Code文件夹

App_Code文件夹正好在Web应用程序根目录下,其存储所有应当作为应用程序的一部分动态编译的类文件。这些类文件自 动链接到应用程序,而不需要在页面中添加任何显式指令或声明来察睁创建依赖性。App_Code文件夹中放置的类文件可以包含任何可识别的ASP.NET组件 ——自定义控件、辅助类、build提供程序、业务类、自定义提供程序、HTTP处理程序等。

    注意        在开发时,对App_Code文件夹的更改会导致整个应用程序重新编译。对于大型项目,这可能不受欢迎,而且很耗时。为此,鼓励大家将代码进行模块化处理 到不同的类库中,按逻辑上相关的类集合进行组织。应用程序专用的辅助类大多应当放置在App_Code文件夹中。

App_Code文件夹中存放的所有类文件应当使用相同的语言。如果类文件使用两种或多种语言编写,则必须创建特定语言的子目录,以包含用每种语言编写的类。一旦根据语言组织这些类文件,就要在web.config文件中为每个子目录添加一个设置:

<compilation>

<codeSubDirectories>

<add directoryName="VBFolder" />

</codeSubDirectories>

</compilation>

重要的是,特定语言的子目录应在web.config文件中注册,否则,不管它们属于哪个文件信滚夹,App_Code文件夹下 的所有文件将被编译成一个单独的程序集。上述配置脚本描述了这么一种情况,即所有的C#文件都放在App_Code文件夹的根目录下,而把几个 Visual Basic .NET类文件移入VBFolder目录中。如果<codeSubDirectories>节中提到的目录不存在,则会收到一个编译错误提 示。

App_Code根文件夹中的文件被编译成App_Code_xxx.dll程序集,其中xxx是随机生成的字符序列。一个 给定子目录中的文件将被编译成一个名为App_SubCode_xxx_yyy.dll的动态创建的程序集,其中xxx指示子目录的名称,而yyy是一个 随机字符序列。只有在应用程序根目录中的web.config文件中进行了设置,<codeSubDirectories>节才有效。

在App_Code目录或任何其他子目录中放置一个assemblyinfo.cs文件,可以创建一个强命名的程序集。显然,如果该文件夹包含Visual Basic .NET文件,那么将使用assemblyinfo.vb文件。程序集配置文件可以引用一个.snk文件来保存强名称的密钥。

注意        给一个程序集设置一个强名称,首先必须获得一个公开/私有密钥对。通过使用强名称(Strong Name)工具(sn.exe),可以获得这样一个密钥对。强名称工具是我们可以在.NET Framework的安装路径中发现的SDK binary之一。密钥对文件通常有一个.snk扩展名。可以将该文件保存到一个应用程序文件夹中,并在assemblyinfo.cs文件中引用它,如下所示:

            [assembly: AssemblyKeyFileAttribute(@"yourKeyPair.snk")]

注意,Visual Basic .NET是在包含Visual Studio Solution的目录中寻找密钥文件,而C#编译器则在包含该binary的目录中寻找密钥文件。据此可知,用此属性调整我们使用的路径,或者把密钥文件放在合适的文件夹中。

在随后发生的任何重新生成中,程序集的名称将发生变化。同时,老的AppDomain请求一结束,就删除老的程序集。

App_Code文件夹并非只能包含类文件。特别是,它可以包含并能自动地处理代表数据架构的XSD文件。把一个XSD文件 添加到该文件夹中时,编译器将把它解析成一个有类型的DataSet类,并将它添加到应用程序作用域中。在ASP.NET 1.x中,这一工作由Visual Studio .NET向导,使用一个命令行实用程序(xsd.exe)完成的。

    注意        使用web.config文件注册一个组件(例如,一个自定义的服务器控件或一个自定义的HTTP处理程序)时,通常要求指定包含该代码的程序集名称。如 果该组件定义在App_Code文件夹中,则应该用什么名称来指示程序集?在这种情况下,只是忽略程序集信息,并规定完整的类名即可。如果没有规定任何程 序集,则ASP.NET运行库将试图从任何已装载的程序集中装入该类,包括为App_Code文件夹动态创建的程序集。

4. App_Data文件夹

App_Data文件夹应该包含应用程序的本地数据存储。它通常以文件(诸如Microsoft Access或Microsoft SQL Server Express数据库、XML文件、文本文件以及应用程序支持的任何其他文件)形式包含数据存储。该文件夹内容不由ASP.NET处理。该文件夹是ASP.NET提供程序存储自身数据的默认位置。

注意        默认ASP.NET帐户被授予对文件夹的完全访问权限。如果碰巧要改变ASP.NET帐户,一定要确保新帐户被授予对该文件夹的读/写访问权。

5. App_GlobalResources文件夹

正如其他应用程序一样,ASP.NET应用程序也可以使用资源,而且通常应该使用资源。资源是隔离应用程序用户界面的可局部 化部分的一种有效方法。一般而言,资源是与程序相关的不可执行的文本。典型的资源有图像、图标、文本和附属文件,但是任何可序列化的对象也可以被看作资 源。应用程序资源存储在应用程序的外部,这样就能在不影响和重新编译应用程序本身的情况下重新编译和替换它们。

ASP.NET应用程序需要有一个主要程序集来保存应用程序默认的或中性的资源。此外,还要部署许多附属程序集,它们中各自 包含我们需要支持的某种文化的本地化资源。在ASP.NET 1.x中,编译一个程序集内的资源有点麻烦。需要手动地将基于XML的资源文件(那些带.res扩展名的资源)编译成.resources二进制文件。这 些文件既可以嵌入到一个.NET可执行文件中,也可以编译成附属程序集。使用资源文件生成器实用程序resgen.exe,将文本和基于XML的资源文件 转变为.resource文件。资源文件名称遵循baseName.cultureName.resource命名约定,其中baseName通常是应用 程序的名称:

resgen.exe ProAspNet20.resx ProAspNet20.it.resources

创建.resource文件以后,应当把它嵌入到一个程序集中,甚至可以作为一个资源容器来使用。要把一个资源文件嵌入到一个附属程序集中,可以使用程序集连接器工具(al.exe)。在命令行上,指出程序集所使用的文化(如下面示例中的it,它代表意大利)和名称。

al /out:ProAspNet20.resources.dll /c:it /embed:ProAspNet20.it.resources

在编译附属程序集之后,它们将有相同的名称。将它们部署到不同的子目录中,分别按文化命名。

幸运的是,对于ASP.NET 2.0,附属程序集的时代已经一去不复返了。更准确地说,附属程序集仍然存在,但是由于App_GlobalResources保留文件夹,对开发人员来说它们已经成为过去的事情。

该文件夹中的任何定位的.resx文件自动地被编译成附属程序 集。.resx文件的名称包含文化信息,以帮助ASP.NET运行库环境的程序集生成。如下文件,resources.resx, resources.it.resx, resources.fr.resx,生成中性程序集以及适合于意大利(Italian)和法国(French)文化的附属程序集。如果没有要求特定文 化,则中性程序集是默认的文化资源。

SNK,作为程序后缀的时候,是.net中的强密匙加密文件!

当你把一个程序集放进GAC(全局程序集缓存)时,就要加强名(也就是签名),在GAC中的程序集可以被所有程序引用访问(相当于以前COM组件在注册表里注册一样),如果不放进GAC,刚所有使用这个程序集都要复制这个程序集(也就是私有程序集),所以用不用强名要看情况而定.

如果不是 要把.dll共享 可以不使用强名

强名称是为了你的Dll文件的安全,一般我们的dll文件,随便在哪只要引用就可以用

但如果用了强名称的话,dll 就会有一个秘钥,其它人就不能引用了

如何创建带有强名称的程序集

可以向程序集分配称为强名称的加密签名,碰镇它为程序集提供名称的唯一性并防止他人借用您的程序集名称(名称欺骗)。如果您正在部署一个将被同一台计算机上的多个应用程序共享的程序集,则该程序集必须有强名称。即使只在您的应用程序中使用该程序集,使用强名称也可确保加载该程序集的正确版本。

生成具有强名称的程序集的第一步是获得加密密钥对。.NET Framework SDK 包括一个可用来生成密钥对的“强名称”工具 (Sn.exe)。由“强名称”工具生成的密钥对可以保留在文件中,您也可以将它存储在本地计算机的“加密服务提供程序”(CSP) 中。下面的命令使用“强名称”工具生成一个新的密钥对并将它存储在名为 TestKey.snk 的文件中:

sn -k Testkey.snk

在获得密钥对后,需要向源文件中添加正确的自定义属性,以便编译器发出带有强名称的程序集。根据用于签名的密钥对是包含在文件中还是 CSP 内的密钥容器中,正确地选择属性。对于存储在文件中的密钥,请使用 System.Reflection.AssemblyKeyFileAttribute。对于存储在 CSP 中的密钥,请使用 System.Reflection.AssemblyKeyNameAttribute。

(*) 如果未指定密钥,则程序集不会被签名。

// (*) KeyName 是指已经安装在

// 计算机上的加密服务提供程序(CSP)中的密钥。KeyFile 是指包含

// 密钥的文件。

// (*) 如果 KeyFile 和 KeyName 值都已指定,则

// 发生下面的处理:

// (1) 如果在 CSP 中可以找到 KeyName,则使用该密钥。

// (2) 如果 KeyName 不存在而 KeyFile 存在,则

// KeyFile 中的密钥安装到 CSP 中并且使用该密钥。

// (*) 要创建 KeyFile,可以使用 sn.exe(强名称)实姿吵猜用工具。

// 在指定 KeyFile 时,KeyFile 的位置应该

// 相对于“项目输出目录”。项目输出

// 目录的位置取决于您是在使用本地项目还是 Web 项目。

// 对于本地项目,项目输出目录定义为

// <Project Directory>\obj\<迹型Configuration>。例如,如果 KeyFile 位于该

// 项目目录中,应将 AssemblyKeyFile

// 属性指定为 [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]

// 对于 Web 项目,项目输出目录定义为

// %HOMEPATH%\VSWebCache\<Machine Name>\<Project Directory>\obj\<Configuration>。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8249580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存