2013-04-09 120 views
0

我有使用MD5-SHA1哈希签名数据的要求(数据的MD5哈希和SHA1哈希合并,然后签名)。使用CryptoAPI的MD5-SHA1哈希

主要要求:

MD5,SHA1哈希值是通过OpenSSL的以某种方式不暴露提供。这个散列是完整的。

现在,我的要求是用签名加密API这个哈希散列无(只需要签名,不要再散列)。为什么CryptoAPI,而不是OpenSSL?因为我正在处理带有不可导出私钥的证书。其私钥只能由CryptoAPI使用,而不能由OpenSSL使用。

这种情况是由SSL握手,其中客户端发送验证部分(非导出的私钥的情况下),我的层,并试图使用签名的CryptoAPI的数据。

另外,我想知道庄家采用使用OpenSSL非导出的私钥证书的其他方式。

+0

如果要求是由您定义,请避免使用MD5,http://en.wikipedia.org/wiki/MD5#Security – Raj 2013-04-09 11:27:28

+0

这一要求没有被我定义。我知道MD5不安全。但在这种情况下,它将与SHA1一起使用并将被签名。这是标准。请参阅http://www.ietf.org/rfc/rfc2246.txt中的第7.4.3节 – doptimusprime 2013-04-09 11:38:51

回答

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的代码似乎高兴与此签名。