强名称密钥密码存储在哪里?

17

我通常不会费心为我的.NET程序集签名,所以对此不了解太多。在我正在工作的一个小项目中,需要进行签名,因此我创建了一个新的带密码保护的密钥。

我期望在重新编译程序集时的某个时间点被提示输入密码,但在创建密钥文件后,我从未需要在任何地方输入过它。这似乎违背了密码保护密钥的初衷。

我想密码可能被缓存到某个地方,但是在哪里?它是否在某种私有存储中?如果我将我的整个解决方案目录与密钥文件一起交给其他人,他们是否会被要求输入我输入的密码,还是能够在没有密码的情况下签名程序集?

互联网上有很多关于强名称密钥和使用它们的文章,但由于某种奇怪的原因,它们都没有详细说明Visual Studio实际上如何使用密码。

更新: 重新启动Visual Studio(和Windows)没有效果,因此缓存似乎是持久性的。删除.suo文件并不能改变签名程序集不需要密码的事实。


1
你是如何使文件受到密码保护的? - Lasse V. Karlsen
1
@Lasse:Visual Studio在创建密钥时有密码保护选项。我已经验证了它是通过打开.pfx文件来保护的。 - Thorarin
如果你重新启动Visual Studio或Windows会发生什么? - CodesInChaos
@CodeInChaos:我仍然没有被提示输入密码。在发布之前我尝试过,但是我忘了提到它。 - Thorarin
如果你删除(或者更名)SUO文件会发生什么?它似乎是许多东西的存储库 - 只有一个要缩小范围。 - user166390
1个回答

12
请参阅创建强名称密钥对话框的文档。

密码信息存储在计算机的加密存储数据库中。

请参阅CLR Inside Out: 使用强名称签名的其他信息。

您可以使用限制访问控制列表(ACL)将私钥安装在密钥容器中,以防止未经授权的访问密钥容器。或者,您可以将私钥存储在智能卡或其他单独的硬件设备上。 sn.exe 工具允许您使用不同的加密服务提供程序(CSP)进行签名。请查看sn.exe文档中的 -c选项。


1
有趣的是…起初,我无法找到任何关于“加密存储数据库”的参考资料。此后我发现可以使用 sn.exe 将密钥添加和删除到/从 Strong Name CSP 中。我仍然遇到一个问题,就是 Visual Studio 似乎会为密钥生成一个随机容器名称,因此我不知道如何删除与我的项目相关联的容器。您也不能使用 sn.exe 列出所有容器名称。 - Thorarin
2
请查看%AppData%\Microsoft\Crypto,其中默认的CSP(加密存储提供程序)存储特定于用户的内容,或者查看%AllUsersProfile%\Microsoft\Crypto以获取机器范围的密钥。 - sisve
1
相当低级,但我设法找到了钥匙(因为它是唯一的)。我尝试了一个叫做KeyPal的工具,但似乎不再起作用了。非常感谢你们迄今为止的帮助 :) - Thorarin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接