我的机器上有两个不同版本的同一个项目.一个来自代码中继,另一个来自代码分支.这些项目使用.pfx键来启用强命名.当我第一次尝试编译项目的trunk版本时,我收到以下错误:
无法导入以下密钥文件:sgKey.pfx.密钥文件可能受密码保护.要更正此问题,请尝试再次导入证书,或使用以下密钥容器名称手动将证书安装到强名称CSP:VS_KEY_45891C38BC1BB345
要解决此问题,我使用sn.exe和以下命令:
sn -i sg Key.pfx VS_KEY_45891C38BC1BB345
这解决了trunk项目的问题,然后愉快地构建.
但是,当我尝试构建项目的分支版本时,我收到相同的初始错误(具有相同的密钥容器名称),当我尝试使用sn.exe安装证书时(不出意外)给出以下错误:
无法安装密钥对 - 对象已存在
这是有道理的,因为我在sn命令上使用了相同的infile和容器,但我想要了解的是:
我正在尝试找到一些有关如何(如果可能的话)枚举强名称CSP(加密服务提供程序)中的所有容器名称的信息.
实质上,当您键入时sn.exe -i key.snk MyContainerName,公钥和私钥对存储在所谓的"容器"中.稍后,在您的代码中,您可以指定容器名称AssemblyKeyNameAttribute,例如:
[assembly: AssemblyKeyName("MyContainerName")]
这将导致程序集在编译时签名.
我试图找出是否有可能以某种方式枚举所有容器名称.我正在为ReSharper编写一个插件,为InternalsVisibleTo属性提供代码完成.我还想为AssemblyKeyName属性提供代码完成,我将使用已知的容器名称预先填充列表.
这些信息是否可访问?
编辑:从IT Security StackExchange 对这个问题的评论中,有一个名为KeyPal的小工具的链接.运行此实用程序LM将转储本地计算机密钥存储区:
Run Code Online (Sandbox Code Playgroud)--------- KeyPal: MACHINE store: 3 keycontainers --------- [0] VS_KEY_F726FDF898BC4CB8 Signature 1024 [1] IIS Express Development Certificate Container Exchange 1024 CertE: CN=localhost [2] MyContainerName Signature 1024 -------------------------------------------------
我可以看到[0]和[2]都是有效的容器名称AssemblyKeyName.但是,有[1]一个 - "IIS Express ...",它不是一个有效的容器.我如何区分它们?
我使用的是 Visual Studio 2022 v17.0.4。我想为我的程序集创建新密钥以对其进行强命名。根据文档:“在选择强名称密钥文件框中,选择浏览,然后导航到密钥文件。要创建新的密钥文件,请选择新建并在创建强名称密钥对话框中输入其名称”。文档
找不到“新建”按钮。

在旧的 Visual studio 中这很容易,但在新的 VS2022 中找不到 NEW 按钮。

请帮忙!
.Net安全noob在这里...防止其他人加载我的程序集的最简单方法是什么?
背景:虽然我真的在寻找'足够好'的保护(有足够的时间/金钱/智能,有人可以成功破解,破解和攻击),这似乎应该已经解决了问题,我只是想念它.
这是我(我想)我知道的:
虽然强大的命名可以用作安全层,但根据这个微软文档,它并不一定是有意的(参见警告:不要依赖强名称来保证安全性.它们只提供唯一的身份.)
在那个^注意我遇到了我无法加载第三方组件的情况(Aspose我认为它是)因为他们没有签署他们的集会,但是我的全部都是.所以我不得不ildasm他们的集会,用我们自己的snk签名,然后ilasm回来),以便使用他们的库.因此,强大的命名对我来说似乎不是一个好的安全机制. 但是 ......在代码中进行简单检查以验证调用程序集是否使用我的公钥令牌?这有效吗?
如果强大的命名不应该用于我想要完成的任务,那么在dll上实现Authenticode数字签名检查路径越好(看起来wintrust.dll可以帮助解决这个问题)?
我一直在经历几个供应商的混淆工具,很多都带有许可和各种东西.我可能会使用一些混淆来隐藏一些敏感部分,但是我仍然希望有一种机制来阻止某人加载我的敏感库,而不必使用字符串和代码加密等功能,这通常会带来性能(和其他)成本.
回到这个问题,阻止某人加载我的程序集的最简单方法是什么?
如果强名称使用受密码保护的pfk签署程序集,是否可以访问AfterBuild节点中用于密钥的密码?
我对现有的.NET程序集dll中的代码进行了一些更改.我没有用于签署代码的密钥文件.如何在不删除StrongNames(Damages应用程序)的情况下强制.NET可执行文件加载它,而无需注册它以跳过验证(不可移植)?
我知道这可能是一个简单的问题,但我开始迷路了。我用于为强名称(在 Visual Studio 项目属性中)签署程序集的私钥是否与生成 CSR 相关/需要?