2013-04-09 3 views
0

У меня есть требование для подписи данных с использованием MD5-SHA1 хеша (хеш MD5 и SHA1 данных объединены, а затем подписаны).MD5-SHA1 хэш с использованием CryptoAPI

Первичное требование:

MD5-хэш SHA1 обеспечивается OpenSSL в некотором роде, не подвергается. Этот хэш завершен.

Теперь мое требование состоит в том, чтобы подписать этот хэш, используя Crypto API без хеширования (требуется только подписание, а не хеширование). Почему CryptoAPI, а не OpenSSL? Потому что я имею дело с сертификатом с неэкспортируемым закрытым ключом. Его закрытый ключ может использоваться только CryptoAPI, а не OpenSSL.

Этот сценарий связан с SSL-связью, где отправляется клиентская часть проверки (в случае неконкурентного закрытого ключа) на мой уровень и пытается подписать данные с использованием CryptoAPI.

Кроме того, я хотел бы узнать о других способах использования неэкспортируемых сертификатов секретного ключа с использованием OpenSSL.

+0

Если это требование определено вами, пожалуйста, избегайте использования MD5, http://en.wikipedia.org/wiki/MD5#Security – Raj

+0

Это требование не определено мной. Я знаю, что MD5 не безопасен. Но в этом случае он должен использоваться вместе с SHA1 и будет подписан. Это стандартно. См. Раздел 7.4.3 на http://www.ietf.org/rfc/rfc2246.txt – doptimusprime

ответ

0

С помощью CALG_SSL3_SHAMD5 в CryptCreateHash и после этого вызова 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 кажется счастливым с этой подписью.

Смежные вопросы