我正在尝试使用WatchData USB token 中的证书进行签名。我使用Microsoft CryptoAPI函数CryptSignMessage。如果我将sha1指定为用于签名的哈希算法,则它将成功。但是,如果我尝试使用sha256,将失败并显示“发生内部错误”。

该驱动程序是从http://www.watchdata.com/service/usbtoken.jsp下载的。
这包含PKCS#11提供程序。

按照http://blogs.msdn.com/b/alejacma/archive/2010/06/02/quot-an-internal-error-ocurred-quot-when-using-sha-2-algorithms-with-signedcms.aspx,这是因为WatchData提供程序不是CNG提供程序-(加密API:下一代)。

使用以下程序对NCryptOpenStorageProvider的调用失败-似乎表明它不是CNG提供程序。

#include <windows.h>
#include <stdio.h>
#include <ncrypt.h>

int main()
{
    NCRYPT_PROV_HANDLE hProv;
    SECURITY_STATUS ret = NCryptOpenStorageProvider(&hProv,
        L"Watchdata Brazil CSP v1.0", 0);
    if( ret != ERROR_SUCCESS)
        printf("Failed\n");
    else
        printf("worked\n");
}

我通过调用CryptEnumProviders API找到了提供程序的名称。

还有其他方法可以使用WatchData token 上的证书对RSA-Sha256进行签名吗?我认为CryptoAPI不需要依赖CSP的哈希功能。哈希是一种标准功能,CryptoAPI确实具有SHA-2的实现。

最佳答案

不幸的是,在CryptoAPI中,即使您将哈希与签名分开进行,也必须提供来自同一CSP的哈希对象,而不仅仅是缓冲区中的哈希数据。在CNG中,情况发生了变化,在这种情况下, key 存储提供程序不进行哈希处理,并且签名发生在哈希缓冲区中,而哈希处理则在其他地方进行,例如在CNG基本提供者中。如果CNG key 存储提供程序获得了意外长度的哈希缓冲区,则它可能仍然会失败,因此,它不能使您免受提供程序不知道给定哈希类型的问题的困扰。

您确定制造商尚未生产可用于设备的CNG key 存储提供程序吗?我注意到在this page上的“WatchKey_USB_Token_Admin_Tool”下载中有一个CNG key 存储提供程序。

更新:该驱动程序不适用于OP的设备。

我看到四个选项:

  • 联系制造商的支持,以查看他们是否可以为您提供此设备的CNG版本(并检查是否确实支持所需的签名机制)
  • 使用备用设备
  • 使用设备的软件包支持的替代API(例如PKCS#11)来进行签名
  • (并且仅在确实需要时),使用幕后软件包
  • 支持的API在自己的CNG提供程序中包装所需的功能

    关于c++ - 无法使用RSA-Sha256签名。 WatchData CSP不是CNG(密码API : Next Generation) Provider?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27996357/

    10-15 00:02