0

我需要使用 MD5-SHA1 哈希对数据进行签名(数据的 MD5 哈希和 SHA1 哈希组合然后签名)。

主要要求:

MD5-SHA1 哈希是由 OpenSSL 以某种未公开的方式提供的。这个哈希是完整的。

现在我的要求是使用 Crypto API 签署这个散列而不进行散列(只需要签名,不需要再次散列)。为什么选择 CryptoAPI,而不是 OpenSSL?因为,我正在处理带有不可导出私钥的证书。它的私钥只能被 CryptoAPI 使用,不能被 OpenSSL 使用。

这种情况来自 SSL 握手,其中将客户端验证部分(在不可导出的私钥的情况下)发送到我的层,并尝试使用 CryptoAPI 对数据进行签名。

另外,我想了解使用 OpenSSL 使用不可导出私钥证书的其他方法。

4

1 回答 1

0

通过在 CryptCreateHash 中使用 CALG_SSL3_SHAMD5 ,然后调用 CryptSetHashParam 然后调用 CryptSignHash 为我完成了这项工作。

让我详细说明一下要求: 1. 通常,我将使用 EVP_PKEY 的私钥提供给 OpenSSL 函数,以便它可以执行签名部分。我曾经从 Windows 证书存储中提取私钥(当密钥被标记为可导出时)。但在一种情况下,私钥未标记为可导出,我无法获得 EVP_PKEY 的私钥。因此,我在私钥不可用的情况下对 OpenSSL 代码进行了修改,然后使用 CryptoAPI 实现签名部分(因为 CryptoAPI 允许使用这种不可导出的密钥进行签名)。

因此,就我而言,数据完全由 OpenSSL 散列(使用 md5-sha1 散列)。留给我的唯一一件事就是签名。

因此,以下步骤(在签名部分下)完成了这项工作:

1. Created hash using Certificate key handle provider and use CALG_SSL3_SHAMD5 algorithm.
2. Using CryptSetHashParam, I set the initial hash value
3. Signed the hash using CryptSignHash.
4. After that, reverse the bytes order (as OpenSSL signature is Big endian mentioned [here][1] which I found after lots of experimenting).

OpenSSL 的其余代码似乎对这个签名很满意。

于 2013-04-13T16:27:39.050 回答