Openssl 使用CryptoAPI的MD5-SHA1哈希

Openssl 使用CryptoAPI的MD5-SHA1哈希,openssl,cryptoapi,Openssl,Cryptoapi,我需要使用MD5-SHA1散列对数据进行签名(将数据的MD5散列和SHA1散列合并,然后进行签名) 主要要求: MD5-SHA1散列是由OpenSSL以某种方式提供的,它没有公开。此哈希已完成 现在,我的要求是使用Crypto API对该散列进行签名,而不进行散列(只需要签名,不再进行散列)。为什么是CryptoAPI,而不是OpenSSL?因为,我正在处理一个带有不可导出私钥的证书。其私钥只能由CryptoAPI使用,不能由OpenSSL使用 此场景来自SSL握手,其中发送客户端验证部分(在不

我需要使用MD5-SHA1散列对数据进行签名(将数据的MD5散列和SHA1散列合并,然后进行签名)

主要要求:

MD5-SHA1散列是由OpenSSL以某种方式提供的,它没有公开。此哈希已完成

现在,我的要求是使用Crypto API对该散列进行签名,而不进行散列(只需要签名,不再进行散列)。为什么是CryptoAPI,而不是OpenSSL?因为,我正在处理一个带有不可导出私钥的证书。其私钥只能由CryptoAPI使用,不能由OpenSSL使用

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


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

在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的其余代码似乎对这个签名很满意。

如果这个要求是由您定义的,请避免使用MD5,这个要求不是由我定义的。我知道MD5不安全。但在这种情况下,它将与SHA1一起使用,并将被签署。这是标准的。请参见中的第7.4.3节