11

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

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

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

4

2 回答 2

22

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

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

于 2012-05-21T18:10:30.140 回答
2

我使用Process MonitorSn.exe(强名称工具)来了解我的 Windows 7 机器上包含我的关键文件的文件夹的位置,从而确认Joe's answer中的信息。

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

Column    Relation    Value    Action
---------------------------------------
Path      contains    crypto   Include

然后我运行 Strong Name Tool ( 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可以通过Visual Studio 的开发人员命令提示符方便地运行。

于 2017-01-24T17:18:52.813 回答