2

我的问题是关于 CNG API 和 Microsoft 提供商的用例。我不编写代码示例,因为与 CSP API 相比,我请求您帮助了解在我的应用程序中使用 CNG API 的最佳方式。

我构建了一个应用程序,它使用通过以下步骤存储的对称密钥:

  • 使用CertFindCertificateInStore枚举“我的”存储中的证书
  • 对于找到的每个证书,使用CertGetCertificateContextProperty询问私钥信息
  • 对于找到的每个私钥信息,存储提供程序名称pwszProvName和容器名称pwszContainerName

然后,当找到密钥时,我的应用程序使用使用 CSP API 找到的私钥执行签名功能:

  • 使用带有pwszProvNamepwszContainerName的CryptAcquireContext初始化提供程序操作
  • 使用 CSP 函数计算签名:CryptCreateHashCryptHashDataCryptSignHash

使用 CSP 功能一切正常。

现在我尝试使用 CNG API 进行签名操作:

  • 使用带有pwszProvName的NCryptOpenStorageProvider初始化提供程序操作
  • 使用 CNG 函数BCryptOpenAlgorithmProvider的开放算法提供程序失败并显示STATUS_NOT_FOUND

当私钥存储在Microsoft Software Key Storage Provider中时会发生此错误。阅读 Microsoft 文档,我了解提供程序的类型是 KSP 提供程序,并且仅对密钥管理起作用。这就是为什么当我尝试原始函数时它失败的原因,我需要使用“原始提供者”。

我找到了按照这些设置使用 CNG 提供程序的方法:

  • Windows Server 2008:创建具有提供程序要求的证书模板(在“加密”选项卡上)。唯一可用的提供商是“Microsoft Software Key Storage Provider
  • Windows 7:用户要求生成密钥,密钥存储在 Microsoft KSP 中。

所以这是我的问题:

  • 我无法使用“Microsoft Software Key Storage Provider”执行原始功能是否正常?

  • 如果我无法使用 Microsoft KSP(它是 KSP 提供程序)执行原始功能(签名、加密、解密、哈希),我如何使我的私钥在 Microsoft Primitive Provider 中存储和管理?

我的麻烦在于,使用 CSP API,默认的 Microsoft CSP 提供程序执行签名(以及解密、加密等)功能。但是使用 CNG API,默认提供程序只执行密钥存储管理。

4

1 回答 1

1

对于非对称密钥,CNG Key Storage Provider 支持的功能与 Primitive Provider 的功能相当,当然除了 KSP(Key Storage Provider)允许您持久化和加载密钥这一事实。

事实上,用于执行加密操作的 KSP API 调用看起来与原始的非常相似,除了 KSP 的开头N和原始的以 . 开头B

例如:

KSP中缺少的对称功能(包括散列),这可能是引起混淆的地方。与 CAPI (CSP/Crypto API) 相比,CNG 签名函数更底层一些——您首先单独散列数据,然后将该散列字节块传递给NCryptSignHash(没有像 CAPI 中那样的散列对象句柄)。

重申一下,因为这对于来自 CAPI 的人来说是一个混淆的来源,您可以使用任何原始提供者MS_PRIMITIVE_PROVIDER或第三方提供者进行哈希处理,然后将结果传递给任何密钥存储提供者的NCryptSignHash,因为它只是数据字节,谁做散列并不重要。NCRYPT_KEY_HANDLE传递的 to确定NCryptSignHash使用什么 KSP 进行签名;没有 CNG 相当于HCRYPTHASH传递给NCryptSignHash.

因此,如果您想使用 KSP 签名,您应该首先使用原始提供者(使用BCryptCreateHash/ BCryptHashData/ BCryptFinishHash)对要签名的消息进行哈希处理,然后将结果传递给NCryptSignHash.

于 2015-01-23T21:06:54.263 回答