2013-04-09 3 views
0

MD5-SHA1 해시 (MD5 해시 및 데이터의 SHA1 해시를 결합한 다음 서명 함)를 사용하여 데이터에 서명해야합니다.CryptoAPI를 사용하는 MD5-SHA1 해시

기본 요구 사항 :

MD5-SHA1 해시가 노출되지 않는 어떤 방법으로 OpenSSL에 의해 제공됩니다. 이 해시가 완료되었습니다.

내 요구 사항은 해싱하지 않고 Crypto API를 사용하여이 해시에 서명하는 것입니다 (서명 만 필요하며 다시 해시하지 않음). OpenSSL이 아닌 CryptoAPI를 사용해야하는 이유는 무엇입니까? 왜냐하면, 수출 할 수없는 개인 키가있는 인증서를 다루고 있기 때문입니다. 개인 키는 CryptoAPI에서만 사용할 수 있으며 OpenSSL에서는 사용할 수 없습니다.

이 시나리오는 클라이언트가 내 레이어로 내보낼 수없는 개인 키의 경우 부분을 확인하고 CryptoAPI를 사용하여 데이터에 서명하려고하는 SSL 핸드 셰이크의 시나리오입니다.

OpenSSL을 사용하여 내보낼 수없는 개인 키 인증서를 사용하는 다른 방법에 대해서도 알고 싶습니다.

+0

요구 사항이 사용자에 의해 정의 된 경우 MD5를 사용하지 마십시오. http://en.wikipedia.org/wiki/MD5#Security – Raj

+0

이 요구 사항은 저에게 정의되지 않습니다. 나는 MD5가 안전하지 않다는 것을 안다. 그러나이 경우 SHA1과 함께 사용되며 서명됩니다. 이것은 표준입니다. http://www.ietf.org/rfc/rfc2246.txt의 7.4.3 절을 참조하십시오. – doptimusprime

답변

0

CryptCreateHash에서 CALG_SSL3_SHAMD5를 사용하고 CryptSetHashParam을 호출 한 다음 CryptSignHash를 호출하면 해당 작업이 수행되었습니다.

요구 사항 : 1. 일반적으로 서명 부분을 수행 할 수 있도록 OpenSSL 기능에 EVP_PKEY를 사용하여 개인 키를 제공했습니다. Windows 인증서 저장소에서 개인 키를 추출하는 데 사용됩니다 (키가 내보낼 수있는 것으로 표시된 경우). 그러나 하나의 시나리오에서 개인 키는 내보낼 수있는 것으로 표시되지 않았고 개인 키를 EVP_PKEY에 가져올 수 없었습니다. 따라서 개인 키를 사용할 수없는 경우 OpenSSL 코드를 수정 한 다음 CryptoAPI를 사용하여 서명 부분을 구현합니다 (CryptoAPI는 내보내기 불가능한 키를 사용하여 서명을 허용하므로).

필자의 경우, 데이터는 OpenSSL (md5-sha1 해시 사용)으로 완전히 해싱됩니다. 나를 위해서 남은 것은 서명하는 것뿐입니다. 은 OpenSSL의 코드

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). 

휴식이 서명에 만족 보인다

그래서, (서명 부분에서) 다음 단계는 일을했다.

관련 문제