密钥存储和检索
密钥存储体系结构
CNG 为私钥存储提供了一个模型,可用于适应当前和将来创建使用公钥或私钥加密等加密功能的应用程序的需求,以及存储密钥材料的需求。 密钥存储路由器是此模型中的中心例程,在 Ncrypt.dll 中实现。 应用程序通过密钥存储路由器访问系统上的密钥存储提供程序 (KSP) ,这会隐藏应用程序和存储提供程序本身的详细信息,例如密钥隔离。 下图显示了 CNG 密钥隔离体系结构的设计和功能。
若要符合共同标准 (CC) 要求,必须隔离长生存期密钥,以便它们永远不会出现在应用程序过程中。 CNG 目前支持使用 Windows Server 2008 和 Windows Vista 附带且默认安装的 Microsoft 软件 KSP 存储非对称私钥。
Windows Server 2008 和 Windows Vista 中默认启用密钥隔离。 密钥隔离功能在之前的平台上不可用。 此外,不会在密钥隔离服务中加载第三方 KSP, (LSA 进程) 。 密钥隔离服务中仅加载 Microsoft KSP。
LSA 进程用作密钥隔离过程,以最大程度地提高性能。 对私钥的所有访问都通过密钥存储路由器,该路由器公开了一组用于管理和使用私钥的综合功能。
CNG 将存储的密钥的公共部分与专用部分分开存储。 密钥对的公共部分也在密钥隔离服务中维护,可通过使用本地远程过程调用 (LRPC) 进行访问。 密钥存储路由器在调用密钥隔离过程时使用 LRPC。 对私钥的所有访问都通过私钥路由器进行,并由 CNG 审核。
如上所述,可以支持各种硬件存储设备。 在每种情况下,所有这些存储设备的接口都是相同的。 它包括执行各种私钥操作的函数,以及与密钥存储和管理相关的功能。
CNG 提供一组用于创建、存储和检索加密密钥的 API。 有关这些 API 的列表,请参阅 CNG 密钥存储函数。
键类型
CNG 支持以下密钥类型:
- Diffie-Hellman公钥和私钥。
- 数字签名算法 (DSA、FIPS 186-2) 公钥和私钥。
- RSA (PKCS #1) 公钥和私钥。
- 几个旧 (CryptoAPI) 公钥和私钥。
- 椭圆曲线加密公钥和私钥。
支持的算法
CNG 支持以下密钥算法。
算法 | 键/哈希长度 (位) |
---|---|
RSA | 512 到 16384,以 64 位为增量 |
DH | 512 到 16384,以 64 位为增量 |
DSA | 512 到 1024,以 64 位为增量 |
ECDSA | P-256、P-384、P-521 (NIST 曲线) |
ECDH | P-256、P-384、P-521 (NIST 曲线) |
MD2 | 128 |
MD4 | 128 |
MD5 | 128 |
SHA-1 | 160 |
SHA-256 | 256 |
SHA-384 | 384 |
SHA-512 | 512 |
密钥目录和文件
Microsoft 旧版 CryptoAPI CSP 将私钥存储在以下目录中。
密钥类型 | 目录 |
---|---|
用户专用 | %APPDATA%\Microsoft\Crypto\RSA\User SID\ %APPDATA%\Microsoft\Crypto\DSS\User SID\ |
本地系统专用 | %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-18\ %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-18\ |
本地服务专用 | %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-19\ %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-19\ |
网络服务专用 | %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\S-1-5-20\ %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\S-1-5-20\ |
共享专用 | %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\RSA\MachineKeys %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\DSS\MachineKeys |
CNG 将私钥存储在以下目录中。
密钥类型 | 目录 |
---|---|
用户专用 | %APPDATA%\Microsoft\Crypto\Keys |
本地系统专用 | %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\SystemKeys |
本地服务专用 | %WINDIR%\ServiceProfiles\LocalService |
网络服务专用 | %WINDIR%\ServiceProfiles\NetworkService |
共享专用 | %ALLUSERSPROFILE%\Application Data\Microsoft\Crypto\Keys |
以下是 CryptoAPI 和 CNG 密钥容器之间的一些差异。
- 与Rsaenh.dll创建的密钥文件相比,CNG 对密钥文件使用不同文件名,Dssenh.dll旧版 CSP。 旧密钥文件也有 .key 扩展名,但 CNG 密钥文件没有 .key 扩展名。
- CNG 完全支持 Unicode 密钥容器名称;CNG 使用 Unicode 容器名称的哈希,而 CryptoAPI 使用 ANSI 容器名称的哈希。
- CNG 在 RSA 密钥对方面更灵活。 例如,CNG 支持长度大于 32 位的公共指数,并支持 p 和 q 长度不同的键。
- 在 CryptoAPI 中,密钥容器文件存储在名称与用户的 SID 文本等效的目录中。 CNG 不再如此,因为 CNG 消除了在不丢失所有私钥的情况下将用户从一个域移动到另一个域的难度。
- CNG KSP 和密钥名称限制为 MAX_PATH Unicode 字符。 CryptoAPI CSP 和密钥名称仅限于 MAX_PATH ANSI 字符。
- CNG 提供用户定义的键属性的功能。 用户可以创建自定义属性并将其与密钥相关联,并使用持久化密钥存储这些属性。
保留密钥时,CNG 可以创建两个文件。 第一个文件包含新 CNG 格式的私钥,并且始终创建。 旧版 CryptoAPI CSP 无法使用此文件。 第二个文件在旧版 CryptoAPI 密钥容器中包含相同的私钥。 第二个文件符合Rsaenh.dll使用的格式和位置。 只有在调用 NCryptFinalizeKey 函数以完成 RSA 密钥时指定了 NCRYPT_WRITE_KEY_TO_LEGACY_STORE_FLAG 标志时,才会创建第二个文件。 DSA 和 DH 密钥不支持此功能。
当应用程序尝试打开现有的持久化密钥时,CNG 会首先尝试打开本机 CNG 文件。 如果此文件不存在,则 CNG 会尝试在旧版 CryptoAPI 密钥容器中找到匹配的密钥。
使用 Windows 用户状态迁移工具 (USMT) 将 CryptoAPI 密钥从源计算机移动或复制到目标计算机时,CNG 将无法访问目标计算机上的密钥。 若要访问此类迁移的密钥,必须使用 CryptoAPI。