Windows中公钥和私钥的容器位置?

时间:2012-05-21 17:45:38

标签: c# .net cryptography private-key public-key

我正在尝试使用以下代码将公钥和私钥存储在容器中:

CspParameters cp = new CspParameters();
cp.KeyContainerName = "Test";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

我想知道的是容器的位置。容器在文件系统中的位置是什么?

2 个答案:

答案 0 :(得分:21)

您将在以下目录(*)中找到关键文件:

Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), 
    @"Microsoft\Crypto\RSA\MachineKeys")

您可以按如下方式获取给定密钥的文件名:

CspParameters cp = ...;
CspKeyContainerInfo info = new CspKeyContainerInfo(cp);
string fileName = info.UniqueKeyContainerName;

我不相信这些信息是有记录的,所以如果您使用它,您将依赖于未记录的实现细节,这些细节在未来的Windows版本中可能无效。不幸的是,有时需要使用它;例如as noted in this question,我认为没有任何其他可靠方法可以从非特权帐户查看RSA密钥容器的权限。

(*)用于机器键。特定于用户的密钥可能位于Environment.SpecialFolder.LocalApplicationData

之下

答案 1 :(得分:2)

我使用Process MonitorSn.exe (Strong Name Tool)来了解我的Windows 7计算机上包含我的密钥文件的文件夹的位置,从而确认Joe's answer中的信息。

首先,我运行了Process Monitor并指定了以下过滤器:

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

sn.exe可以通过Developer Command Prompt for Visual Studio方便地运行。

相关问题