2017-09-11 15 views
2

CryptGenRandom()은 단일 전역 프로그램 전체 HCRYPTPROV 인스턴스에서 스레드로부터 안전합니까?CryptGenRandom()은 스레드로부터 안전한가요?

MSDN은 여기에 대한 정보 부족에 나타납니다 https://msdn.microsoft.com/en-us/library/windows/desktop/aa379942(v=vs.85).aspx

스레드 당 별도의 HCRYPTPROV 만들기 크게 문제를 복잡하게 할 다시 파괴 (그리고 내 옆에 더 보안 관련 버그를 위험)를, 그래서이 될 것이다 정말 알고 유용합니다. 하나의 글로벌 HCRYPTPROV를 공유하는 것이 훨씬 쉽습니다.

여기 CryptGenRandom()의 스레드 안전성에 대해 알고있는 사람이 있습니까? 특히 HCRYPTPROV 인스턴스가 하나 뿐인 경우?

+0

에 왜 그냥 고정하지? 별도의 인스턴스보다 덜 복잡합니다. –

+0

글쎄, 만약 당신이 app-lifetime 쓰레드의 풀을 사용한다면, 당신은 하나의 쓰레드 당 하나의 쓰레드를 생성 할 수 있고 그들을 계속 생성/파괴 할 필요가 없다. 그게 너에게 효과가 없을까? –

+0

예,이 API 호출은 사실에 의해 스레드로부터 안전합니다. 왜 여기에 약간의 스레드 간섭이있을 수 있다고 생각합니까? – RbMm

답변

2

스레드 당 별도의 HCRYPTPROV을 만드는 것은별로 의미가 없습니다. 현재의 모든 구현에서 heap로부터의 메모리 블록에 대한 포인터입니다. 실제 공급자 구현 (이 경우에는 CPGenRandom)을 호출하는 데 사용 된 CSP entry points에 대한 포인터를 주로 저장합니다. 참조 자체는 실제 키 상태를 포함하는 HCRYPTKEY과는 달리 CSP상태을 포함하지 않습니다. 따라서 모든 스레드에 대해 별도의 HCRYPTPROV을 만들더라도 변경되지 않습니다.

이 호출 중에 내부적으로 CSP에 의해 사용되는 일부 전역 변수/데이터가있을 수 있습니다. 이것은 구현 세부 사항이므로 알 수 없습니다. 물론 우리는 코드에서 CryptGenRandom에 대한 호출을 직렬화 할 수 있습니다. 그러나 우리는 우리의 프로세스에서 다른 dll도 CryptGenRandom을 동시에 호출하는 것을 제어 할 수 없습니다. 그래서 모든 전화를 CryptGenRandom으로 직렬화하는 것도 불가능합니다.

결과적으로 나는 CPGenRandom이 스레드로부터 안전해야한다고 생각합니다. 그리고 잘 알려진 Microsoft CSP로 테스트 한 사실이 사실입니다. 내부 동기화는 함수에서 사용되며, 글로벌 데이터에 액세스해야하는 경우와 복수 스레드가 CPGenRandom을 동시에 호출하는 경우 필요합니다. 모든 스레드는 고유 한 무작위 데이터를 수신합니다.

그래서 내 결론 - CryptGenRandom가 스레드 안전, 적어도 모든 Microsoft CSP

+0

매우 유익한 추론으로이 상세한 분석에 대해 대단히 감사드립니다. 이 대답은 참으로 옳다는 것을 확신합니다. 감사! –