Windows中公钥和私钥的容器位置?
我试图使用以下代码将我的公钥和私钥存储在容器中:
CspParameters cp = new CspParameters(); cp.KeyContainerName = "Test"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
我想知道的是容器的位置。 容器在文件系统中的位置是什么?
您将在以下目录(*)中找到关键文件:
Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), @"Microsoft\Crypto\RSA\MachineKeys")
您可以按如下方式获取给定密钥的文件名:
CspParameters cp = ...; CspKeyContainerInfo info = new CspKeyContainerInfo(cp); string fileName = info.UniqueKeyContainerName;
我不相信这些信息是有记录的,因此如果您使用它,您将依赖于未记录的实现细节,这些细节在未来的Windows版本中可能无效。 不幸的是,有时需要使用它; 例如, 如本问题所述 ,我认为没有任何其他可靠方法可以从非特权帐户查看RSA密钥容器的权限。
(*)那是机器键。 特定于用户的密钥可能位于Environment.SpecialFolder.LocalApplicationData
我使用Process Monitor和Sn.exe(强名称工具)来了解我的Windows 7机器上包含我的密钥文件的文件夹的位置,从而确认Joe的答案中的信息。
首先,我运行了Process Monitor并指定了以下filter:
Column Relation Value Action --------------------------------------- Path contains crypto Include
然后我运行强名称工具( sn.exe
) †从我的容器VS_KEY_773685D47C32F8C7
的密钥对中提取公钥,并将其导出到public_key.snk
:
sn.exe -pc VS_KEY_773685D47C32F8C7 public_key.snk
执行此操作后,我注意到Process Monitor指示sn.exe
对该文件夹发出了几个访问请求:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
…以及包含名为VS_KEY_773685D47C32F8C7
容器的公钥和私钥的文件:
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\74c2c10a37baa69f7969c7144db5805d_c55067c2-4a01-4792-9d70-d7a6e4799447
†可以通过Visual Studio的开发人员命令提示符方便地运行sn.exe
。