我要求使用MD5-SHA1哈希对数据进行签名(数据的MD5哈希和SHA1哈希被合并然后签名)。
主要要求:
OpenSSL以某种未公开的方式提供MD5-SHA1哈希。这个哈希是完整的。
现在我的要求是使用Crypto API签署此哈希而不进行哈希处理(只需要签名,而不是再次进行哈希处理)。为什么选择CryptoAPI,而不是OpenSSL?因为,我正在处理带有不可导出私钥的证书。它的私钥只能由CryptoAPI使用,而不能由OpenSSL使用。
此方案来自SSL握手,其中发送客户端验证部分(在不可导出的私钥的情况下)到我的层并尝试使用CryptoAPI对数据进行签名。
此外,我想了解使用OpenSSL使用不可导出的私钥证书的其他方法。
答案 0 :(得分: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的其余代码似乎对此签名感到满意。