Расположение контейнера для открытых и закрытых ключей в Windows?

Я пытаюсь сохранить свои общедоступные и закрытые ключи в контейнере, используя следующий код:

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

То, что я хотел бы знать, это расположение контейнера. Является ли местоположение контейнера в файловой системе?

Ответ 1

Вы найдете файлы ключей в следующем каталоге (*):

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

Ответ 2

Я использовал Process Monitor и Sn.exe(Сильное имя Tool), чтобы узнать местоположение папки на моей машине с Windows 7, содержащей мои ключевые файлы, и тем самым подтвердить информацию в Джо.

Сначала я запустил Process Monitor и задал следующий фильтр:

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

Затем я запустил Strong Name Tool (sn.exe) & dagger; чтобы извлечь открытый ключ из пары ключей в моем контейнере 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

& dagger;sn.exe можно удобно запустить с помощью Командная строка разработчика для Visual Studio. p >