2013-04-09 111 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的代碼似乎高興與此簽名。