Windows中密钥容器存储文件的GUID后缀是什么?

时间:2018-05-14 01:48:42

标签: windows security cryptoapi cng

我想知道存储在计算机和用户密钥容器存储中的RSA密钥容器文件的GUID后缀是什么。我无法通过CAPI / CNG将其中一些识别为关键容器,尽管我将使用命令行工具来揭示我的案例。以下命令适用于提升提示中的PowerShell。在大多数计算机上,GUID后缀对于所有这些文件名都是相同的,但是在这一个上有四个不同的GUID,而API只返回只有一个的键。 这个GUID是什么?我不喜欢存储的随机密码我不知道我的机器上有什么; 可以安全删除吗?

机器商店目录的内容是:

> ls -n $env:ProgramData\Microsoft\Crypto\Rsa\MachineKeys  | sort { "$_"[-3..-1] }
d1f9044f5d7345da71c0d2efd2e4f59e_e9f96f2e-b8b7-49b2-85a5-840195eca603
d6d986f09a1ee04e24c949879fdb506c_a4dc5a56-574d-4e4b-ba8d-d88984f9a6c5
6de9cb26d2b98c01ec4e9e8b34824aa2_a4dc5a56-574d-4e4b-ba8d-d88984f9a6c5
76944fb33636aeddb9590521c2e8815a_a4dc5a56-574d-4e4b-ba8d-d88984f9a6c5
d6d986f09a1ee04e24c949879fdb506c_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
d1f9044f5d7345da71c0d2efd2e4f59e_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
76944fb33636aeddb9590521c2e8815a_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
6de9cb26d2b98c01ec4e9e8b34824aa2_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
ba8e1b9b5510957b3af7b811f05660de_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
d1f9044f5d7345da71c0d2efd2e4f59e_c6a7fc9d-32a6-41e4-afd5-7dc7b822029e

我按最后三个字符对列表进行了排序,因此很容易一目了然地看到密钥容器文件有4个不同的GUID后缀。现在让我们枚举所有已安装的CSP报告的密钥。我将使用Windows附带的certutil工具获取提供程序列表,然后获取每个提供程序密钥的列表。它的输出需要一些正则表达式的魔法来解析,这不是必需的,只是方便:

> certutil -csplist | sls  '^Provider Name: (.*)' | %{ $_.Matches[0].Groups[1].Value }
Microsoft Base Cryptographic Provider v1.0
Microsoft Base DSS and Diffie-Hellman Cryptographic Provider
Microsoft Base DSS Cryptographic Provider
[...snip...]

单个键的输出列出了名称,标志和密钥容器ID,后者匹配上述目录中的相应文件名(当然,我们可以看到更多来自其他KSP,智能卡,TPM等的密钥) 。一个提供程序的示例(-q使某些提供程序无提示失败,而不是要求用户执行操作,例如插入SmartCard):

> certutil -key -q
Microsoft Strong Cryptographic Provider:
  iisConfigurationKey
  6de9cb26d2b98c01ec4e9e8b34824aa2_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  RSA
    AT_KEYEXCHANGE

  iisWasKey
  76944fb33636aeddb9590521c2e8815a_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  [...snip...]

某些键名也只是GUID,但是如果我们只刷出以至少20个十六进制数字开头的行,则只会列出ID。因此,所有提供商的所有密钥ID都可以简洁地显示在:

> certutil -csplist | sls '^Provider Name: (.*)' | %{ $_.Matches[0].Groups[1].Value } |
%{ certutil -key -q -csp "$_" } | sls '^\s+[0-9a-f]{20}.+' | sort -u

  597367cc37b886d7ee6c493e3befb421_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  6de9cb26d2b98c01ec4e9e8b34824aa2_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  76944fb33636aeddb9590521c2e8815a_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  ba8e1b9b5510957b3af7b811f05660de_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  d6d986f09a1ee04e24c949879fdb506c_f7fe3b04-ef9b-4b27-827f-953c5743e2ec
  f0e91f6485ac2d09485e4ec18135601e_f7fe3b04-ef9b-4b27-827f-953c5743e2ec

实际上这里的密钥比MachineKeys目录中的密钥多2个(它们来自KSP,实际上,certutil -key -csp KSP显示它们,如果你想知道的话)。但事实是它们都具有相同的GUID后缀_f7fe3b04-ef9b-4b27-827f-953c5743e2ec

该机器由供应商安装(确切地说是HP笔记本电脑)。这与其他机器不同,我们组装或购买准系统并自行安装和配置。我有时会处理一些敏感数据,所以我确实偏执在允许机器访问敏感数据之前彻底审查软件。

操作系统是Windows 10,如果这很重要,但是相同类型的存储从Windows 7,AFAIK没有改变,即使在8.0(或8.1?)中引入了新的CNG API。

如果有人发现有用的PowerShell代码段可供提供者列出密钥,我使用了这个命令:

> certutil -csplist | sls  '^Provider Name: (.*)' | %{ $_.Matches[0].Groups[1].Value } |
%{ Write-Host -for Yellow "`n$_"; certutil -key -q -csp "$_" }

1 个答案:

答案 0 :(得分:1)

在这里找到答案:https://serverfault.com/a/642279/451491

  

文件命名约定为x_y,其中x是一个随机GUID,用于   唯一地标识密钥,y是在以下位置找到的计算机GUID   HKLM \ SOFTWARE \ Microsoft \ Cryptography。